Tag: 蓝鸟

Promise.promisify后无法读取undefined的属性

let nasPath = ""; return getFamInfo(args.familyID) .then(function (famInfo) { nasPath = //some code involving famInfo here return getSFTPConnection(config.nasSettings); }).then(function (sftp) { const fastPutProm = Promise.promisify(sftp.fastPut); return fastPutProm(config.jpgDirectory, nasPath, {}); }); 如果我在const fastPutProm = Promise.promisify(sftp.fastPut);之后放置断点const fastPutProm = Promise.promisify(sftp.fastPut); , fastPutProm是一个带三个参数的函数。 但是,当我尝试运行此代码时,我得到一个TypeError: Cannot read property 'fastPut' of undefined错误的TypeError: Cannot read property 'fastPut' of undefined 。 我在这里做错了什么?

bluebirdjs的承诺包裹在for循环内

我有一堆用于向我的服务提供数据的函数。 我想循环通过它们中的每一个,并在其中一个返回所需的结果时立即停止。 如果第一个工作,那很好。 如果它有一个例外或数据无效,我想移动到下一个等等。 我怎么能做到这一点? 我有下面的代码: handleData: function(address) { var self = this; return new Promise(function (resolve, reject) { for (var i = 0; i < self.listAllAvailableProviders.length; ++i) { var handler = self.listAllAvailableProviders[i]; new handler().getData(address) .then(function(value) { Logger.info(value); resolve(value); }) .catch(function(err){ Logger.error(err); }) } reject(""); }); } 我怎样才能解决它停止,只要第一个得到正确的数据? 我已经阅读bluebirdjs文档无济于事。 编辑我resolve后,把一个break语句,我得到这个: SyntaxError: Illegal break statement at […]

如何捕捉蓝鸟ENOENT?

因为fs.exists的弃用,我喜欢用蓝鸟捕捉ENOENT。 举个例子: .then(() => { return promisedFs.unlinkAsync(excelPath); }) .catch(ENOENT ERROR, () => { //do something }) .catch(all other errors, () => {//do something})

添加拒绝/决心赶上/成功

我使用下面的代码,我想知道最佳实践的用法,如果我应该添加拒绝在这个承诺内的承诺? run: function (req, res) { if (req) { return this._un(req).then(function() { return proce.restart().then(function() { return res.status(200).end("sucess"); //Here should I use reslove }); }).catch(function(err) { return res.status(500).send("error: " + err); //Here should I use reject??? }); } else { return new Promise(function(resolve, reject) { reject("No application content found"); }); } } };

蓝鸟的Promise.all()是否等待迭代器?

以下示例来自http://bluebirdjs.com/docs/api/promise.all.html var files = []; for (var i = 0; i < 100; ++i) { files.push(fs.writeFileAsync("file-" + i + ".txt", "", "utf-8")); } Promise.all(files).then(function() { console.log("all the files were created"); }); (蓝鸟)Promise确保for循环会在我们启动Promise.all()之前完成,或者for循环如此之快以至于我们可以假设它们会在Promise.all()之前完成? 我试图理解我可以期待完成的任务,以及我需要环绕Promise的东西,以便在不必要的时候不写这样的东西: some_promise_that_makes_files_array_with_for_loop().then(function(files){ Promise.all(files).then(function() { console.log("all the files were created"); }); });

停止承诺链多个捕获

在Node.js中,我需要读取一个文件并validation它的内容,所有内容都是asynchronous的。 我使用Node.js 6.6 , 蓝鸟3.4.6 示例代码: // pseudo function to read file contents – resolves when 'flag' is true, rejects when 'flag' is false. function readFile(flag) { return new Promise(function (resolve, reject) { console.log('Reading file…'); if (flag) { resolve('File contents'); } else { reject('readFile error'); } }); } // pseudo function to validate file contents […]

如何promisify我使用NodeJS蓝鸟创build一个正则函数?

我第一次用Mongoose方法调用testing了Bluebird。 这很容易,只需要做Promise.promisifyAll(myObj) ,然后调用myObj.methodAsync 但是当我试图在没有mongoose的情况下实现它时,我不知道该怎么做,例如: function Foo(){} Foo.prototype.test = function(c,cb){ cb(new Error(),{a:1, b:2, c:c}); }; module.exports = new Foo(); 这会引发这个错误。 未处理的拒绝(<{“a”:1,“b”:2,“c”:true}>,没有堆栈跟踪)。 这是要catch ,我可以使用它没有错误。 任何人都知道如何实现我的方法来与承诺实现良好的工作?

如何在NodeJS中使用Promises(Bluebird)处理条件callback

我目前正试图重构我拥有的代码库,并希望有一个更开发人员友好的代码库。 第一部分正在改变对Promise的callback。 目前,在一些地方,我们正在使用Async.waterfall来压扁callback地狱,这对我很有用。 其余的地方,我们不能是因为他们是有条件的callback,这意味着不同的callback函数里面的if和else if(x){ call_this_callback() }else{ call_other_callback() } 现在我在Node.JS中使用蓝鸟作为承诺,我无法弄清楚如何处理有条件的callback来压扁callback地狱。 编辑一个更现实的场景,考虑到我没有得到这个问题的症结所在。 var promise = Collection1.find({ condn: true }).exec() promise.then(function(val) { if(val){ return gotoStep2(); }else{ return createItem(); } }) .then(function (res){ //I don't know which response I am getting Is it the promise of gotoStep2 //or from the createItem because in both the different database is […]

在我返回res.end()之后,Promise仍然会进入下一个链。

我在express中使用bluebird,当我返回res.end(),Promise仍然进入下一个链,这里是我的代码: Promise.resolve(operate).then(function(data){ if (!!data && data.length !=0) { log.info('success'); return true; }else { log.warn('fail'); return res.end(); } }).then(function(data){ if(data) { log.info('done'); return res.end(); }else { log.warn('fail'); return res.end(); } }) 如果失败,我会在日志中得到2个“失败”,如果我在第一次失败,我该如何停止?谢谢! 蓝鸟版本:〜2.10.2; 节点:4.3.1; 快递:〜4.2.0

使用蓝鸟承诺,如何解决与延期的反模式?

我正在学习蓝鸟承诺,我正试图学习不再使用任何延期()。 下面的代码正确运行100%并按预期运行。 但是,这里是对我重构代码的练习,以便正确使用Bluebird承诺,而不是使用Deferred解决scheme。 我试图学会以不同的方式(正确地)对Promise进行思考,但经过多次尝试,我仍然无法find如何在没有 Deferreds的帮助下解决这个特定问题的方法。 有没有人有一个想法? 这里是如何运行它: 1)在你的控制台运行这个程序。 它将启动将使用端口8080的websocket服务器。 2)然后在另一个控制台窗口中再次运行它。 那个将启动并使用端口8081 3端口8080失败后使用端口8081。 // Initialization stuff const WebSocket = require('ws'); var wsServer; // Main Program // ================================================================= tryCreateWebsocket().then( function(){ console.log("Websocket succesfully initialized."); }, function(){ console.log("Websocket startup has failed!"); } ); // ================================================================= // Helper function: Creating a websocket, with a port as parameter function createWebsocket(port){ return […]