Tag: q

承诺error handling的基础知识

假设我有这样的代码,假设db.get()是一个promisified API: var promises = []; for( var i = 0; i < 10; i++ ){ promises.push( getFromDatabase("age") ); } Q.all(promises).then(function(results){ // something },function(error){ log.error( error ) }); function getFromDatabase(property){ return db.get(property).then(function(result){ return result; },function(error){ log.error( error ) }) } 谁来处理这个错误? Q.all()的promise链中的函数或者Q.all()的promise链中的函数。 另外,如果在Q.all()有一个顶级error handling程序,是否需要在辅助函数中处理错误?

dynamic数组承诺序列

我得到dynamic(承诺的数量可以改变每个运行时)承诺数组,现在我希望每个决心或拒绝之后处理返回的承诺之前承诺数组将完成。 我承诺尽全力,但是在所有的承诺完成之后,这一切都将继续下去。 如果数组(承诺)不是dynamic的,所以我可以简单地使用这样的事情,但我不知道我在数组中有多less承诺,我希望在每一个承诺履行或…继续与它的答案而不是等到所有的承诺完成 firstMethod() .then(secondMethod) .then(thirdMethod); 我们正在使用Q … 可能吗 ? 更新(示例) 可以说我有promise数组 [promise1,promise2,promise3, promiseN] 现在我要用promise1完成处理, 然后不等所有的承诺完成。 这里最大的问题是数组可以有N个承诺,我不知道在RT多less诺言,我会得到,直到我得到这个数组, 因此我不能简单地使用 更新2 (澄清更多:-)) 棘手的部分… 如果我事先知道数组的大小,那么我可以简单地使用数组5链中的条目,但是这里的棘手部分是,我不知道在承诺数组中有多less承诺… 。

简单的Q承诺节点的例子

我试图把我的头围绕Q库/承诺一般,所以我可以在我的节点应用程序中实现它,但我很难find一些简洁和具体,足以快速入门。 有人可以帮助我把这个代码翻译成一个使用Q的承诺库的asycronous模式吗? // # For those new to coffeescript // # '(params) ->' === 'function (params) {}' in coffeescript // # '@' === 'this' in coffeescript // # NPM Q = require 'q' // # Database class module.exports = class Database constructor: () -> // # mongoose @mongoose = require('mongoose') // # Make database connection […]

在独立脚本中的javascript node.js,阻止/等待承诺

我在node.js中有一个简单的程序,比如: // CODE1 step1(); step2(); var o = step3(); step4(o); step5(); step6(); 这个程序是在一个独立的脚本(而不是在一个Web浏览器)中运行的,它是一个顺序程序,执行顺序是重要的(例如,step6需要在第5步之后执行)。 问题是,step3()是一个asynchronous函数,并且值“o”实际上被传递给给定的callback,所以我需要修改程序如下: // CODE2 step1(); step2(); step3( function (o) { step4(o); step5(); step6(); }) 从callback函数调用step4是有意义的,因为它取决于step3计算出的“o”值。 但step5和step6函数不依赖于“o”,我必须将它们包含在该callback函数中,仅保留执行顺序:step3,step4,step5,step6。 这听起来对我来说真的很糟糕。 这是一个顺序程序,所以我想将step3转换为同步function。 这个怎么做? 我正在寻找这样的东西(例如使用Q): // CODE3 step1(); step2(); var deferred = Q.defer(); step3(deferred.resolve); deferred.blockUntilFulfilled() // this function does not exist; this is what i am looking for […]

在Q中学习承诺和例外与拒绝

我的印象是,承诺内的exception会触发后续的失败处理程序,但在这段代码中看不到它发生: var Q = require('q'); function x() { console.log('x'); var deferred = Q.defer(); setTimeout( function() { console.log('resolving x'); deferred.resolve('hi'); }, 1000 ); return deferred.promise; } function y() { console.log('y'); var deferred = Q.defer(); setTimeout( function() { console.log('throwing in y'); throw new Error('Oih!'); }, 1000 ); return deferred.promise; } x().then(y).then( function () { console.log('yes'); }, function […]

使用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-mysql插入产生一个数组?

根据node-mysql 文档 ,向具有auto_increment主键的表中插入行的结果是一个对象,其中一个字段是insertId。 但是,我没有看到这在运行下面的代码。 相反,我看到结果是一个两个元素的数组,其第一个元素是所需types的对象,但其第二个元素是undefined 。 特别是,下面的代码打印: [ { fieldCount: 0, affectedRows: 1, insertId: 12, serverStatus: 2, warningCount: 0, message: '', protocol41: true, changedRows: 0 }, undefined ] 任何人都可以解释文档和观察到的行为之间的差异吗? 码: var mysql = require("mysql") var Q = require("q") var db = { "host": "localhost", "user": "root", "password": "xyz", "database": "study" } var pool = mysql.createPool(db); […]

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

使用Q在Node.js中同步诺言的麻烦

我目前在框架Sails.js Node.JS做一个API。 我第一次使用承诺,我有一些麻烦,像我想要的同步我的承诺。 我的主要function如下: createCard: function(req, res) { checkIfUserHasStripeAccount(req.user) .then(addCreditCardToStripeAccount()) .then(function cardCreated() { res.send(200, { msg: 'Card created' }); }) .catch(function handleError(err) { res.send(err.httpCode, err.msg); }) }, 很明显,如果用户没有信用卡,就无法将信用卡添加到条形账户。 函数checkIfUserHasStripeAccount()检查账户是否存在,如果没有,创build它。 这是这部分的代码: function checkIfUserHasStripeAccount(user) { var deferred = q.defer(); if (!user.idStripe) { createStripeAccountToUser(user) .then(function(savedUser) { deferred.resolve(savedUser); }) .catch(function(err) { deferred.reject(err); }) } else { deferred.resolve(user); } return […]