Tag: 承诺

Node.js:如何以正确的方式处理promise

我有一个Node.js(express.js) – 服务器,我提供了一个简单的authenticationapi。 在我的一条路线中,我在返回“资源”之前改变了很多子步骤。 我使用蓝鸟的承诺。 router.post('/register', function(req, res, next) { // ——- 1. check if already existing var p = store.checkIfExisting(req, res) //–>mongoose .find(). Returns promise .then(function(isExisting) { if (isExisting) { console.log("try to cancel"); p.cancel(); } // ——- 2. Facebook validation return validateFacebookSignedRequest(req.body.fbsrCookie); //True/False }) .then(function(fbIsValid) { // ——- 3. create Users return store.saveUser(req, res); […]

有条件的完成承诺

我有一个承诺链,我执行一些行动。 当我达成一个特定的陈述时,我想创build一个分支,它可能会继续链,否则,将解决整个即将到来的承诺链。 readFile('example.json').then(function (file) { const entries = EJSON.parse(file); return Promise.each(entries, function (entry) { return Entries.insertSync(entry); }); }).then(function () { if (process.env.NODE_ENV === 'development') { return readFile('fakeUsers.json'); } else { // I am done now. Finish this chain. } }) // conditionally skip these. .then(() => /** … */) .then(() => /** … */) // […]

所有承诺解决后执行承诺

我已经写了一些遍历目录的代码,选取所有的jpg文件,重命名它们,创build拇指文件夹,并将它们放在该文件夹中。 我也编写了一个函数,每个图像生成一个html块,在forEach循环结束时应该把所有的输出写入一个文件。 // Read the directory fs.readdir(dir, function (err, files) { // Return the error if something went wrong if (err) { console.log("Something went wrong"); } //Make thumbs dir fs.mkdirSync(thumbsFolder); // For every file in the list files.forEach(function (file) { var extension = path.extname(file); if (extension === ".jpg") { //Rename images var renameTask = renameImages(file, […]

在节点js中使用Promise

我在nodejs中是新的。 我已经开始学习nodejs了。 我想在nodejs中使用promise。 我已经成功安装bluebird.Cureently我的代码看起来: req.getConnection(function(err,connection){ var query = connection.query('SELECT node_questions.question_name,node_questions.description FROM node_questions LEFT JOIN node_user ON node_questions.user_id=node_user.id;SELECT * FROM node_user ORDER BY points DESC LIMIT 5',function(err,rows) { var data =rows[0]; var data2 = rows[1]; console.log(data); console.log(data2); res.render('index', { page_title: 'Welcome',session:req.session.userId,email:req.session.email,data:data,data2:data2}); }); }); }; 我想在这里使用承诺。 我能怎么做。 请帮忙…

处理成功的HTTP承诺,如果一个蓝鸟失败

我对Promises相当陌生,一直试图让这段代码正常工作。 这是我的。 var Promise = require('bluebird'); Promise.join(getProducts, getPricing, function(products, pricing) { console.log('products: ' + products.body); console.log('pricing: ' + pricing.body); // Add pricing to products here res.send(products.body); }) .catch(function(e) { console.log(e); res.sendStatus(500); }); 要求… 我想同时调用这两个API,并在两个完成时处理结果。 如果定价API失败,我仍然希望返回没有定价的产品。 如果产品API失败,我想错误发送500回到客户端。 我的代码似乎工作,如果两个API调用都成功,但总是进入捕获,如果失败,并忽略任何成功的调用。 如果我使用同步Promise链,我可以很好地工作,但是我想同时调用这两个API。 我怎样才能asynchronous调用这两个API并在catch之外处理结果?

使用promise时如何突破串行循环?

我有一个长文本文件,我逐行循环提取一些事件数据并将其存储在数据库中。 该文件定期获得最新的数据在顶部。 当发生这种情况时,我再次运行文件提取新的事件,但是当我遇到已经在数据库中的事件时(文件总是按照最新到最旧的顺序),我想停止。 使用这个回答中描述的reduce()方法的问题正确的方式来编写promise的循环 ,我想出了这个函数来parsing文件: function parse( file) { var lines = file.split("\n"), latestDate; return lines.reduce(function(promise, line) { return promise.then(function() { if (/* line matches date pattern */) { latestDate = line; } else if (/* line matches event pattern */) { return Event.createAsync(line, latestDate); } return promise; }); }, Promise.resolve()) .catch({ errorName: "uniqueViolated" }, […]

承诺在foreach

我有一些关于逻辑的代码。 我下面的代码块按预期工作,所以willbeUpdatedvariables不能以同步的方式逐字更新。 var willbeUpdated = 1; anArray.forEach(function(i){ getPromisedData(i).then(function(d){ willbeUpdated += d; }); }); if (wiillbeUpdated == something) { // some logic } 所以问题是,我是否必须为这个foreach逻辑再次创build一个承诺的方法, outside if logic的话,那么在这种情况下是否是一个最佳实践或者其他可取的想法呢? 编辑:我问这个问题听到最好或更好的方法嵌套asynchronous函数处理,而不是确切的代码块,谢谢。

在NodeJS中用q.all命名承诺结果

我有点新东西,我发现它非常棒,但有些东西我仍然无法弄清楚。 我设法通过传递q.all一个q.all数组来运行一些联合的promise。 像这样的东西 var promises = [promiseOne(), promiseTwo()]; q.all(promises).then(function (results) { res.send(results); } ); 事情是这样的,我真的希望这些承诺被命名,所以我不必依靠承诺的顺序。 我读了一个地方,你实际上可以传递一个对象到q.all ,以得到命名的结果。 所以这将是这样的: var promises = { promiseOne: promiseOne(), promiseTwo: promiseTwo() } q.all(promises).then(function(results){ res.send(results); }); 但我想这只是不像发送数组一样,因为我没有得到我的承诺的结果在那里。 我得到的结果类似于这个: { promiseOne: { source: {} }, promiseTwo: { source: {} } } 那么你怎样才能从q.all得到命名结果呢? 有一件事要注意的是,我将在promises数组中promises数量并不是固定的,因为我通过从用户发送到我的函数的GET参数得到了这个数字。 此外,在我的每一个承诺,我有承诺的另一个数组(或对象)被parsing,其结果我也想命名。

请求承诺的顺序请求

有没有一个嵌套的方式来实现以下request-promise : r = require('request-promise'); r(url1).then(function(resp1) { // Process resp 1 r(url2 + 'some data from resp1').then(function(resp2) { // Process resp 2 // ….. }); }); 每个请求都取决于最后的结果,所以它们需要是顺序的。 然而,我的一些逻辑需要多达五个连续的请求,并导致相当嵌套的噩梦。 我是否在谈论这个错误?

我怎样才能节制堆栈的API请求?

我有一个id数组,我想为每个id做一个api请求,但是我想控制每秒有多less个请求,或者更好的是,在任何时候只有5个打开的连接,并且当一个连接是完成,取下一个。 目前我有这个,它只是在同一时间发射所有的请求: _.each([1,2,3,4,5,6,7,8,9,10], function(issueId) { github.fetchIssue(repo.namespace, repo.id, issueId, filters) .then(function(response) { console.log('Writing: ' + issueId); writeIssueToDisk(fetchIssueCallback(response)); }); });