Articles of 蓝鸟

如何在then()中传递bluebirdcallback的参数?

我有一个回报的承诺。 在这一刻,我这样做: Something( … ) .then(()=>{console.log("Done.");}); 这会更实际: Something( … ) .then(console.log, "Done."); 例如, setTimeout工作原理是这样的: setTimeout(console.log, 1000, "Done."); 蓝鸟有任何方法吗? 我的目标是要有这个实际的select来减less承诺产生的已经很荒谬的代码量。

蓝鸟promise.all不尊重结果顺序

我正在使用最新的稳定的蓝鸟: "bluebird": "~3.4.0", 并用下面的代码: Promise.all([ParticipantsService.retrieveActiveParticipantsFromTheLocalDb(), EventService.retrieveActiveEventsFromTheLocalDb(), HeatService.retrieveActiveHeatsFromTheLocalDb()]).then( function (results) { var namedResults = {participants: results[0], events: results[1], heats: results[2]}; return res.render('runners/runners', namedResults); }).catch( function (err) { winston.error('Failed to retrieve participants and or event details', err); return res.send(err); }); 我希望namedResults总是有正确的顺序排列的元素匹配的承诺数组的顺序,但这是不正确的! 我每次都有不同的顺序。 我假设这是因为它是蓝鸟的文档上说的: http : //bluebirdjs.com/docs/api/promise.all.html除非我读这个错误… 谁能帮忙? 谢谢

承诺的节点骑士

我正在尝试使用骑士的评估function。 一个简单的例子: var Horseman = require('node-horseman'); var horseman = new Horseman(); horseman .open('http://google.com') .evaluate(function() { var promise = new Promise(function(resolve,reject){ setTimeout(function(){resolve("Hello")},2000); }); return promise; }) .then(function(mesg){ console.log(mesg); }) .close(); 我期待解决的价值“你好”被传递到下一个函数作为mesg参数当承诺履行,但相反,我得到以下错误: Unhandled rejection fn evaluate global code evaluateJavaScript@[native code] evaluate@phantomjs://platform/webpage.js:390:39 我错过了什么吗?

JavaScript承诺依赖性处理

我有下面的代码示例。 var Promise = require('bluebird'); var model = function (object) { this.name = object.name; }; model.prototype.download = function () { var self = this; return new Promise(function (resolve, reject) { setTimeout(function () { resolve(); }, Math.random() * 100) }); }; model.prototype.process = function () { var self = this; return new Promise(function (resolve, reject) { […]

Promise.all无效迭代抛出生成器

试图了解Javascript生成器和承诺,我已经检查他们是好的ALAX。 我需要迭代抛出承诺的协程( Promise.coroutine来自Bluebird的libray),使得按照正确的顺序执行一些承诺是很容易的。 有了这个代码(抱歉延迟的反模式,我会学习,以避免它): function myPromise(x,time,i){ var deferred = Q.defer(); setTimeout(() => { deferred.resolve(x + i); },time); return deferred.promise; } router.get('/', function(req, res, next) { for (var i = 0; i < 5; i++) { Promise.coroutine(function*(i) { var a = yield myPromise('a',6000,i); var b = yield myPromise('b',1000,i); console.log(a,b); })(i) .then(() => { console.log('Then'); }). catch((err) […]

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"); }); });