Articles of 承诺

如何testing在testing函数中没有返回的被调用的promise

首先,我一直在尝试几乎所有的东西来使这个代码工作,我取得了成功,问题是我不喜欢这种方法,我想知道是否有更好的东西,我可以做,以便使testing代码更具可读性,但function。 我想断言 (举例来说, secondApiCall )已经调用了第二个函数( secondApiCall ) ,但似乎没有办法做到这一点,你会怎么做呢。 这是否有一个非hacky方法? 这里的主要问题是“我不能修改functionToTest ”,我必须编写testing,基本上检查API调用正在完成。 如何使用给定的代码在functionToTest完成后运行断言? PS:代码是狗屎,我知道,但有时你只需要处理它,你不能再做更多的感谢只是在重构之前testing它的狗屎它:( const firstApiCall = () => { return new Promise(function(resolve,reject) { setTimeout(() => { resolve('firstApiCall success'); }, 3); }); }; const secondApiCall = () => { return new Promise(function(resolve,reject) { setTimeout(() => { resolve('secondApiCall success'); }, 3); }); }; const functionToTest = () […]

同时完成儿童程序和承诺决议

tl; dr:我写的一个函数创build了几个subprocess,当他们在消息中提交他们的数据时,这个subprocess解决了这个承诺。 虽然函数将所有这些承诺包装在一个Promise中。所有的函数都会突然返回,并且promise也不会解决也不会拒绝,即使所有的过程都完成了没有错误。 任何想法为什么发生这种情况? 为了加速数据收集过程,我有一个父进程获取一些input数据(在SQL数据库中查询的date是准确的),并将它发送给大小相等的一些subprocess,等待subprocess完成处理他们的数据通过包装他们的结果在一个大的承诺。 虽然这适用于较小的数据集,但对于较大的数据集,父承诺只会返回到命令行 – 既不解决也不拒绝,甚至不能继续执行function。 看了几个日志之后,似乎所有的subprocess都正确地处理并发送了他们的数据,但是父进程并没有收到less数几个进程的结果。 错过的消息发生在数据处理结束的附近(当几个subprocess在大约同一时间完成并发送消息时) 缩写代码: // main function function createArray(i,j) // returns an array of i empty arrays, each of length j function chunkify(a, n, balanced) // divides array a into n chunks (balancing them in size if true) returning an array of chunks function kidcollector(snaptimes,course) { var done […]

如何find哪些promise在nodejs中未处理UnhandledPromiseRejectionWarning?

从版本7的nodejs有asynchronous等待处理承诺的sintactic糖,在我的apis下面的警告经常出现: (node:11057) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): ReferenceError: Error: Can't set headers after they are sent. (node:11057) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. 不幸的是,没有提到渔获缺失的地方。 有没有办法find它没有检查每个try catch块?

这是正常的bluebird / node.js / expresserror handling?

所以,我做了这个愚蠢的错字,花了我相当多的时间来find它,因为我总是从执行mongoose查询中得到一个空的错误。 我重新创build了一个更通用的行为。 var express = require('express'); var router = express.Router(); var Promise = require('Bluebird'); router.patch('/test', function (req, res, next){ var testPromise = new Promise(function (resolve, reject) { resolve(); }) .then(function(result){ if(thisIsAnExampleTypo){} res.status(200).json({ message: 'this will no be executed because of the typo', object: result }); }) .catch(function(err){ //console.log(err); return res.status(500).json({ title: 'This will execute because […]

如果对象使用promise,则AWS签署url

我有一个用于生成签名url的代码片段。 下面的return语句总是返回空的url。 其余的数据正确解决。 当我debugging时,我看到return callback function validSignedURL首先被执行,然后function validSignedURL的resolve部分被调用。 awsHelper .s3vldSignedURL(s3Link) .then(function(signedURL) { data[1].url = signedURL; return callback(null, successResponse.getResponse(context, 'OK', data)); }); s3vldSignedURL映射到下面的函数。 这里s3.headobject是基于promise的,用来检查一个文件是否存在于s3中。 我希望这个函数是通用的,这样我就可以使用它来为任何s3object生成一个签名的url。 function validSignedURL(bucket, path) { console.log("Generating Presigned Link … "); const s3 = new aws.S3(); let params = { Bucket: bucket, Key: path }; let checkObj = s3.getObject(params); return new Promise(function(resolve, reject){ […]

麻烦与js诺言(蓝鸟)

我试图从列表中创buildMailChimp中的合并域,如果它们不存在。 如果他们不存在,我希望他们被推到承诺的列表,我使用promises.all以确保所有必要的列表项已被添加。 这不是工作。 我究竟做错了什么? var productDict = [] var getMergeNumPromise = new Promise( function(resolve, reject) { // call to mailchimp to get the number of merge fields rp({ uri: MAILCHIMP_MERGEFIELDS_URI, qs:{count:1}, json:true, headers:MAILCHIMP_HEADER }) .then(function( mergeFieldList ) { console.log("total items: " + mergeFieldList.total_items) resolve(mergeFieldList.total_items) }) .catch(function(err) { console.log("error getting merge field count: " + err) […]

我怎么能概括Node.js中的http响应处理程序?

我正在为节点应用程序编写一个rest api,并且我发现自己重写了如下的很多内容: function(req, res, next) { databaseCall() .then( (results) => { if (results != null) { res.status(200).send(results); } else { res.sendStatus(404); } }) .catch(function(err) { console.log("Request error: " + err.stack); res.sendStatus(500); }) } 我想重构响应部分,所以我可以做类似的事情 databaseCall() .then(handleResponse) handleResponse将负责整个响应/捕获过程。 但我不能完全弄清楚如何做到这一点。 databaseCall方法因端点而异 – 有时需要一个参数,有时不需要。 我可以做一个通用的函数expression式,将数据库调用的结果,并将其坚持在承诺链,但我不知道如何访问该函数内的响应对象。 我知道我可以添加另一个function来结合一切,如下所示: function(databaseCall, parameter, req, res, next) { databaseCall(parameter) .then( (results) => { if […]

Node JS MY SQL使用promisepipe理事务

我想在一个事务中将对象保存到数据库中。 对象有两个子对象和一个数组列表对象,数组列表中的每个对象都有自己的数组列表: { "person": { "id": null, "personal_no": "555555555555555555" }, "reservation": { "id": null, "personal_no": null, "status_id": null, "reservationDetail": [ { "id": null, "status_id": null, "room_id": 44, "start_date": "2017-08-09T18:04:26.938Z", "end_date": "2017-08-09T18:04:26.938Z", "category_id": 64, "reservationPerson": [ { "reservation_id": "123", "person_id": "5555555555555555551" }, { "reservation_id": "123", "person_id": "5555555555555555552" } ], "reservationService": [ { "reservation_id": "123", "person_id": "5555555555555555553" […]

如何同步一系列的承诺?

我有一个promise对象数组,它们必须按照它们在数组中列出的顺序来parsing,也就是说,我们不能尝试parsing一个元素,直到前一个元素已经被parsing(方法all([…]) )。 如果一个元素被拒绝,我需要链条立即拒绝,而不是试图解决下面的元素。 我怎样才能实现这个,或者是否有这样的sequence模式的现有实现? function sequence(arr) { return new Promise(function (resolve, reject) { // try resolving all elements in 'arr', // but strictly one after another; }); } 编辑 最初的答案build议我们只能sequence这些数组元素的结果,而不是它们的执行,因为它是在这个例子中预定义的。 但是,那么如何以避免提前执行的方式生成一系列的promise? 这是一个修改的例子: function sequence(nextPromise) { // while nextPromise() creates and returns another promise, // continue resolving it; } 我不想把它作为一个单独的问题,因为我相信这是同一个问题的一部分。 解 下面的一些答案和后面的讨论有点不对劲,但最终的解决scheme正是我所期待的,它是在spex库中作为方法序列实现的 。 该方法可以迭代一系列dynamic的长度,并根据应用程序的业务逻辑的需要创buildpromise。 后来我把它变成了一个供大家使用的共享库。

用节点骑士刮一批页面:一些例外情况没有抓住

我正在使用nodeman和horseman来search(已知是有效的)url列表,并依次对它们执行相同的scraping操作。 我试图捕捉错误,但有时候,一些exception仍然通过并挂起脚本。 我可以一次运行同一个urls'batch',并且再次发生错误。 到目前为止,我已经尝试过: – 捕捉错误; – 使用promiseRetry模块重试promise – 使用打开和closures每个刮擦操作的新马实例 // users: [ { href: '?id=abc123' }, … ] // queuePromise: function which returns a chain of promises from an array of functions with callbacks // promiseRetry: used to retry a promise :3, see promiseRetry documentation fetch = function(users, options){ var baseUrl = 'https://www.somedomain.com/Users' var […]