Tag: 承诺

Javascript的承诺模式 – 区分错误

考虑这个代码块: getUser(userId) .catch(function(error){ crashreporter.reportError('User DB failed', error); // show user a generic error }) .then(function(user) { return chargeCreditCard(user); }) .catch(function(error){ crashreporter.reportError('Credit card failed', error); // show user an error saying that their credit card got rejected }) 显然,这个问题是THEN(USER)块在用户DB失败的情况下被执行。 另一个select是将第一个catch块移动到链的末尾。 但是,这会导致另一个问题! 我们将无法区分错误是来自User DB还是CreditCard。 下面的模式,我认为解决问题,认为是一个承诺反模式? 有没有更好的方法来做到这一点? 我看到的问题是,你可以在半callback地狱。 getUser(userId) .then(function(user) { return chargeCreditCard(user) .catch(function(error){ crashreporter.reportError('Credit card failed', error); […]

node.js函数返回未定义的值

我有一个问题,从数据库与node.js获得restaurantname,它似乎必须做一些callback参数,但我不能find我的情况的解决scheme,希望你们中的一个可以帮助我。 我做了一个从数据库中获取餐厅名称的函数。 第一个控制台日志行给出了正确的retvalue,第二个给出了未定义的,我怎么写代码,以便返回值是餐厅的名称? 亲切的问候,罗伯特 function restaurantName(id) { var retvalue; try { F.model('restaurant').load(id).then(function (restaurant) { retvalue = restaurant.Name; console.log('restaurantName 1(' + id + ')' + retvalue); }) } catch (err) { retvalue = 'Error'; } console.log('restaurantName 2(' + id + ')' + retvalue); return retvalue; };

承诺如何创build?

我对Promise对象的理解如下: var Promise = { then: function() { … }, catch: function() { … } }; 如果我有下面这个代码有一个函数,并返回一个Promise对象( fetch.js ): var xhr = require('xhr') module.exports = function (uri) { return new Promise(function (resolve, reject) { xhr(uri, function (err, res, body) { if (err) return reject(err) if (res.statusCode !== 200) return reject(new Error(body)) resolve(body) }) }) } […]

承诺不会按顺序执行javascript

我有下面的代码片段使用承诺执行。我有的问题是承诺没有执行顺序等待第一个块执行之前,继续下一个块 下面是代码: array[] new Promise(function(resolve, reject) { //userarray is some array with user id's userarray.forEach(function(entry) { User.findOne({ user_id: entry}, function(err, user) { if (err) throw err; console.log(user.name); array.push(user.name); }); }); resolve("success"); }) .then(function() { console.log(array); console.log("done"); }); 下面是输出 [] //数组仍然是空的 DONE 汤姆 迪克 掠夺 当我想要的是 汤姆 迪克 掠夺 [“汤姆”,“迪克”,“哈里”] DONE

Promise.prototype.then()行为

我有这个承诺: var seasonalityArray; … aService.gettingAnalysis(site, cohortKey) .then(function (result) { let date = moment(); seasonalityArray = result.cooling.getSeasonMonths(date); }) , function (error) { console.error('An error occurred', error); }; const totalAccounts = _.size(report.asModel().accountNumbers); const warnings = _.compact(_.map(seasonalityArray, function (monthLabel) { … })); … aService.gettingAnalysis = function (site, Key) { return Promise.all([ aService.findingHeat(site, Key), aService.findingCool(site, Key) ]).spread(function (heating, cooling) […]

NodeJs,诺言不等

我有这个function,应该使300请求一个网页(基准testing),但是Promise.all没有等待这些请求完成之前输出一个空的数组,任何想法? function requestLoop(){ var resultSet= []; // options.requests = 300 // options.url = http://localhost/ for(var c=1;c<=options.requests; c++){ http.get(options.url, function(res){ // resultSet.push( { request: c, statusCode: res.statusCode}); resultSet.push(new Promise(function(res){ return { request: c, statusCode: res.statusCode}; })); }); } Promise.all(resultSet).then(function(){ console.log(resultSet); }); return; } Promise是蓝鸟,http是普通的http包

ES6 Dyanmic Promise从arrays链接

脚本 我有一个我需要下载的URL数组,但每个都必须提供唯一的事务ID,必须从服务器请求,并且只有在请求成功时才会增加。 问题 当我循环访问数组时,我需要等待事务ID的请求和文件的请求,然后开始下一个迭代循环,但是文件的数量不是固定的,所以需要dynamic地构build一个链承诺。 伪代码 下面是一些伪代码,getFiles()是问题,因为所有的请求获得相同的事务ID,因为他们不等待前一个请求完成。 function getTransationId(){ return new Promise((resolve,reject)=> { let id = getNextTransactionId(); if(id!=error){ resolve(id); }else{ reject(error); } }) } function getFile(url, transactionId){ return new Promise((resolve,reject)=>{ http.request(url+transactionId, function(err,response){ if(err){ reject(err); }else{ resolve(response); } }); }); } function getFilesFromArray(urlArray){ for(let url of urlArray){ getTransactionId().then(resolve=>getFile(url,resolve),reject=>console.error(reject)); } } 题 我如何dynamic链式承诺? 回答 这是一个Ovidiu的回答JSFiddle

我如何创build一个像钻石一样的js承诺链

我坚持承诺。 说我的程序结构是这样的 Func A //gets data then passes to I1 and J2 / \ Func I1 Func J1 //then route I & J run without interaction | | Func I2 Func J2 \ / Func B //Func B gets both the result of both 我有一些麻烦得到这个工作。 我就是这样 getdata.then(data=>{ var methods = Promise.all([ funci1.x(data).then(output=>{ funci2.x(output) }), funcj1.x(data).then(output2=>{ […]

承诺不等待超时

我正在学习诺言库,但坚持以下问题。 //Function for getting sum function getSum(n1, n2) { var isAnyNegative = function() { return n1 < 0 || n2 < 0; } var promise = new Promise(function(resolve, reject) { if (isAnyNegative()) { reject(Error("Negatives not supported")); } resolve(n1 + n2) }); return promise; } ////Function for getting Difference function getDiff(n1,n2){ var diff = n1-n2; setTimeout(function(){ […]

如何使用mongoose原生诺言(mpromise)find一个文件,然后保存

我试图重构callback地狱承诺。 我如何使用findById.exec()然后object.save()承诺? exports.changeAnimalName = function(req, res) { var Animal = mongoose.model('Animal', animalSchema); Animal.findById(id, function (err, animal) { if (animal) { animal.name=req.body.name; animal.save(function (err, animalSaved) { if (err) return console.error(err); return res.send(animalSaved); }); } }); }