Tag: 承诺

callback金字塔,甚至与当时的承诺

我有三个function,我想要一个接一个地执行,只有当前一个function完成任务。 我使用当Promise库这个, function taskA(){ var d = when.defer(); d.resolve(); return d.promise; } function taskB(){ var d = when.defer(); d.resolve(); return d.promise; } function taskC(){ var d = when.defer(); d.resolve(); return d.promise; } taskA().then(function(){ taskB().then(function(){ taskC().then(function(){ }); }); }); 这是应该如何? 我的印象是,我可以很容易地避免使用承诺callback和它的“厄运金字塔”,或者我用他们错了吗?

使用Q将node.js fs.readFile作为承诺的操作

当我使用deferred.resolve方式来承诺一个行动,我无法得到该文件的内容 function readFile(fileName) { var deferred = Q.defer(); fs.readFile(fileName, 'utf-8', deferred.resolve); return deferred.promise; }; readFile('test.txt').then(function (err, data) { console.log('data:' + data) }) 我得到的data:undefined输出 但是,当我承诺行动httpGet时,它工作正常 var httpGet = function (opts) { var deferred = Q.defer(); http.get(opts, deferred.resolve); return deferred.promise; }; httpGet('http://www.google.com').then(function (res) { console.log("Got response: " + res.statusCode); res.on('data', function (data) { console.log(data.toString()); }) } ); […]

Node.js:为“yield”关键字promisifyingcallback库

我试图用Koa.js构build一个简单的REST API。 它使用ES6生成器函数,我发现比callback更愉快(它们就像C#的asynchronous等待)。 yield关键字需要一个可接受的(promise,thunk,generator)。 我使用Bluebird的promisifyAll方法promisifycallback库(在我的情况下请求),但我仍然不断收到错误。 这是我的代码和错误: var koa = require('koa') , route = require('koa-route') , app = module.exports = koa() , Promise = require('bluebird') , request = Promise.promisifyAll(require('request')); app.use(route.get('/users', list)); function *list() { var res = yield request.get('http://backbonejs-beginner.herokuapp.com/users'); this.body = res.body; } app.listen(3000); 堆栈跟踪的错误: Error: yield a function, promise, generator, array, or object at next […]

JavaScript(asynchronous)如何确定在继续之前要“等待”什么?

最近我正在使用JavaScript,我试图弄清楚解释器是如何决定何时“等待”以及何时asynchronous移动到下一行代码的。 以这两个代码示例。 阅读我的意见,我的困惑。 1: function doAThing(thing, callback) { var someBoolean; if ( !thing ) { someBoolean = true; } else { someBoolean = false; } // Calling the callback function only happens *after* the above if statement, // meaning the interpreter waits instead of just calling it immediately? callback(someBoolean); } 2: function doOtherThing(thing, callback) { […]

我怎样才能触发一个单一的error handling器嵌套承诺?

为什么没有任何deferred.reject()调用在.fail()触发.fail()处理程序? 我怎样才能触发一个单一的error handling器嵌套承诺? 我需要嵌套承诺closures。 当我在d1上触发拒绝时,仍然一直到d2的parsing/拒绝。 如果我将.fail()添加到d1的块中,那么它确实会收到拒绝。 但是这正是我试图避免的,每个嵌套promise的.fail()处理程序。 var Q = require('q'); somePromise().then(function (v1) { var d1 = Q.defer(); asyncFunc1(v2, function (err, v3) { if (!v3) d1.reject(new Error('error')); else d1.resolve(true); return d1.promise.then(function (promise1Kept) { var d2 = Q.defer(); asyncFunc2(v4, function (err, v5) { if (!v5) d2.reject(new Error('error')); else d2.resolve(true); }); return d2.promise.then(function (promise2Kept) { console.log('end of […]

如何使用catch,最后与when.map

我想使用when.map函数来处理一些数据。 数据处理后,我需要做一些清理(例如释放当前使用的数据库连接回连接池)。 我的方法使用catch的问题, finally是finally被调用,当第一个reject发生,而其他映射仍在进行中。 那么我怎么才能等到所有的映射承诺都完成了,这样才有可能做一个保存清理。 require('when/monitor/console'); var when = require('when'); function testMapper(value) { console.log('testMapper called with: '+value); return when.promise(function(resolve, reject) { setTimeout(function() { console.log('reject: '+value); reject(new Error('error: '+value)); },100*value); }); } when.map([1,2,3,4],testMapper) .then(function() { console.log('finished') }) .catch(function(e) { console.log(e); }) .finally(function() { console.log('finally') }); 产量 testMapper called with: 1 testMapper called with: 2 testMapper called […]

我如何正确编写一个模块来与Bluebird的PromisifyAll兼容

比方说,在node.js模块moduleA.js ,我有以下一些节点式asynchronous函数: // moduleA.js var init = function (data, callback) { return callback(null, data.params ); }; var delay = function(data, callback) { setTimeout(function(){ callback(null, data); }, 1000*3); } var reverse = function(data, callback) { var j, d = {}; for(j in data) { d[ data[j] ] = j; } callback(null, d); } module.exports = { […]

有没有正确的方式来存储解决的承诺?

现在几乎每个节点包都有callbackAPI。 如果我正在编写包装器,ORM例如: const Promise = require('bluebird'); const mongo = Promise.promisifyAll(require('mongodb')); class ORM { constructor(mongoUrl) { this.db = mongo.connectAsync(mongoUrl); } collection(name) { return this.db.then((db) => { return db.collectionAsync(name); }); } } 这是正确的吗?

有条件地返回承诺的问题(Nodejs)

这个问题的标题可能需要编辑 嗨,我有一个方法,要么返回一个对象或承诺。 function如下: function getAllTypes() { if(cache_hit) return from_cache; else { // db Query findAllTypes.then(function(result){ return result; } } } 这个函数将根据情况返回一个promise或一个普通的JS对象。 这是一个实用的function,将会在很多不同的地方使用。 我想保持它的返回types不变,即在这两种情况下承诺或纯JS对象(这不需要解决)。 有没有办法做到这一点?

使用node.js并承诺获取分页数据

请记住,我是node.js的新手,我使用的是android开发。 我的情况是这样的: 针对返回null或值的数据库运行查询 使用该数据库值调用Web服务,该数据库提供分页信息,这意味着在调用中,如果有更多信息要获取,我将获得一个参数以传递给下一个调用。 所有的项目被检索后,将它们存储在数据库表中 如果一切正常,对于以前收到的每件商品,我需要再次进行networking通话,并将检索到的信息存储在另一个表中 如果提取任何数据集失败,则必须从数据库中恢复所有数据 到目前为止,我已经试过这个: getAllData: function(){ self.getMainWebData(null) .then(function(result){ //get secondary data for each result row and insert it into database } } getMainWebData: function(nextPage){ return new Promise(function(resolve, reject) { module.getWebData(nextPage, function(errorReturned, response, values) { if (errorReturned) { reject(errorReturned); } nextPage = response.nextPageValue; resolve(values); }) }).then(function(result) { //here I need to insert […]