Articles of 承诺

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 […]

理解承诺链

我在NodeJS项目中使用Promise,并希望更好地理解Promise.chains。 我有一个暴露的function: 主要库函数,我希望我的用户调用。 它会返回一个承诺,然后用户需要处理的决心和拒绝的。 主库函数将调用许多其他库函数,我想要链接。 所以每个函数都会返回一个这样的承诺: mainLibraryFunction = function (arguments…) { return this.firstLibraryFn().then(secondLibraryFn).then(thirdLibraryFn)… } 这些都将返回一个承诺,可以拒绝或解决。 我想要的是,如果任何库函数拒绝,然后将拒绝传递到下一个函数,我想返回的MainLibraryFunction的拒绝。 因为否则我需要实现每个库函数的error handling。 因为他们每个人都会得到承诺作为参数,所以我需要检查每个函数,那么我得到解决或拒绝的承诺作为参数。 然后我需要通过所有的函数传递被拒绝的参数,直到最后的函数可以返回它的MainLibraryFunction。 这不是明智的。 那么处理这个问题的最佳做法是什么呢? 我应该在链条的末尾添加捕获吗? 我听说如果我加了一个尾巴,即使有人会拒绝,也应该打破这个链条。 然后从catch,我可以返回Promise.reject()出MainLibraryFunction。

asynchronous并行和承诺不会工作

我有以下两个片段: 这是我想要运行的单位: health.checkHealth = function (req, res) { async.parallel({ cassandra: function (callback) { cassandraRepository.ping(callback); }, kafka: function (callback) { kafkaHelper.ping(callback); }, vault: function (callback) { vaultClient.health() .then((isOk)=>{ callback(null, isOk)}) .catch(()=> callback(null, false)); } }, function (err, result) { var response = {}; if (result.cassandra) { response.cassandra = "OK"; } else { response.cassandra = "Failed"; res.status(500); […]

使用mongoose的承诺进行护照authentication

var LocalStrategy = require('passport-local').Strategy; var User = require('../models/user'); module.exports = function(passport){ passport.use('local-signup', new LocalStrategy({ usernameField: 'email', passwordField: 'password', passReqToCallback: true }, function(req, email, password, done){ User.findOne({'local.username': email}).exec() .then(function(user) { console.log(user); if(user){ return done(null, false, {message: 'Username already taken!'}); } else{ var newUser = new User(); newUser.local.username = email; newUser.local.password = password; return newUser.save(); } }) […]

承诺 – 抓住内在的一面

我有以下代码,有一些链接的承诺。 我试图在内部抛出一个错误, then我期望被外部catch ,但它不是目前的行为: User.getById(userId).then((user: any) => { if (user.email != email) { User.getByEmail(email).then((user: any) => { throw new OperationError("exists")); }).catch(StorageError, (err: any) => { user.email = email; return user.save(); }); } else { return user.save(); } }).then((user: any) => { return { ok: true, user: user }; }).catch(OperationError, (error: any) => { return { […]

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

我使用下面的代码,我想知道最佳实践的用法,如果我应该添加拒绝在这个承诺内的承诺? 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"); }); });

我怎么能放弃JavaScript的承诺?

我在NodeJS项目上工作,我用Promise在我的代码中链接了一些方法,我需要在“thens”链中的一个中止 findEmployeeByCW('11111', "18-09-2016"). then(function () { return findEmployeeByCWE('111111', "18-09-2016", '111111') }, function () { console.log('createEmployeeLoginBy') createEmployeeLoginBy('111111', "18-09-2016", '111111'). then(function (log) { SaveEmployeeLogToDb(log) // *************** // ^_^ I need to exit here …. }) }) .then(function (log) { return updateLoginTimeTo(log, '08-8668', '230993334') }, function () { return createNewEmployeeLog('224314', "18-09-2016", '230993334', '08-99') }) .then(SaveEmployeeLogToDb).then(DisplayLog).catch(function (e) { console.log(e); […]

如何正确获取从承诺返回的值?

我正在使用nodejs + Express作为我的后端服务。 我有一个authenHandler.js文件来帮助authentication与sequ​​elize: module.exports = { isAuthenticated: function(data) { models.Users.find(data) .then(function(user) { if (user) { return true; } else { return false; } }); } } 当我在app.js中使用这个辅助函数时: app.use(function(req, res, next) { // process to retrieve data var isAuthenticated = authProvider.isAuthenticated(data); console.log(isAuthenticated); if (isAuthenticated) { console.log("auth passed."); next(); } else { var err = new […]

如何处理在我想要之前返回的asynchronous代码?

我有一个函数,其中包含代码… db.query(query).then(results => { _.each(results, result => { db.query(anotherQuery).then( /* modify result based off anotherQuery results */ }); }); resolve(results); }); 当然,正在发生的事情是resolve(results))正在被运行,同时第二个对数据库的请求正在运行,这意味着承诺不会在返回之前添加额外的数据。 有没有一种模式可以用来避免这种情况? 我正在使用Sequelize,它是由Bluebird for Promises支持的。 这是一个我曾经遇到过的模式,我已经看过使用wait.for,但它似乎已经过时,并且不支持Promise 。