Tag: 诺言

为什么Promise中的承诺仍然悬而未决?

这是我重组我的代码,以正确使用承诺。 整个程序是一个基本的webscraper。 这个挑战是试图确保lastStep可以访问每个页面的HTML和URL,所以我试图在nextStep()返回一个对象。 我是控制台日志logging的HTML,它被正确地返回,但由于某种原因,承诺被logging如下: Promise { <pending> } 。 为什么会发生这种情况,我该如何解决? 谢谢! //Modules being used: var cheerio = require('cheerio'); var json2csv = require('json2csv'); var request = require('request'); var moment = require('moment'); var fs = require('fs'); //harcoded url var url = 'http://shirts4mike.com/'; //url for tshirt pages var urlSet = new Set(); var remainder; var tshirtArray = []; […]

避免在基于promise的循环中发生recursion堆栈溢出?

作为一个简单的例子程序,我有一个连续ping服务器的节点脚本,希望这个程序长时间运行。 程序设置为一个返回一个promise对象的ping函数。 这个承诺是根据ping是工作还是失败来解决或拒绝的。 我希望这个函数在一个循环中运行,所以无论ping是否成功,在前一个请求被parsing之后的一段时间之后 ,下一个ping将被触发。 问题不是这个任务本身,而是我关心我的实现。 我相信最终会导致堆栈溢出。 这里有一些代码来看看发生了什么: function doPing(host) { // returns a promise object. } function doEvery(ms, callback, callbackArgs) { setTimeout(function() { callback.apply(null, callbackArgs) .always(function() { doEvery(ms, callback, callbackArgs); }); }, ms); } doEvery(1000, doPing, [host]); 我试图限制代码只是为了反映以下问题的范围: 这最终会导致堆栈溢出? 有一种模式可以防止使用promise的基于callback的循环溢出吗?

如何从saveAsync返回一个Mongoose对象?

我已经promubified与蓝鸟mongoose – 似乎工作正常,除了由saveAsync()返回的文档只是普通的对象,缺乏方法/虚拟。 order.saveAsync().then(function(order) { order.save(); // errors with object has no method 'save' 我使用“保存”作为示例,但没有内置方法或我的自定义方法似乎可用。 我怎样才能得到一个从saveAsync返回的Mongoose对象?

在ES6 + babel中用蓝鸟Promisify导入类(构造函数)

假设我创build了或有一个node.js库lib.js export class C { constructor(value, callback) { callback(false, `Hello ${value}`); } task(value, callback) { callback(false, "returned " + value); } } 重要的部分是类的构造函数需要接受一个callback,因为它做的是数据库连接和文件I / O。 如果我现在导入并使用库callback样式,则一切正常(请参阅下面的c1 )。 我真的很想在图书馆中使用它来使对象构造更加方便(实际上它是一大堆类和方法)。 但是,我无法在保证安全的前提下正确地findnew的课程。 import Promise from 'bluebird'; import * as lib from './lib'; Promise.promisifyAll(lib); // old style — works as expected const c1 = new lib.C("c1", (e, v) => […]

茉莉花:testing返回的承诺是一个具体的例外

我有一个方法在我的node.js服务器,返回一个Promise – 抛出一个自定义exception( UserNotAuthenticatedError ) – 我想编写一个testing,以确保这个exception抛出时,必须。 方法如下: export function changePassword(userId, oldPass, newPass) { var query = User.findById(userId); return query.exec() .then(user => { if (user.authenticate(oldPass)) { user.password = newPass; return user.save(); } else { // I want to test that this Exception is thrown throw new UserNotAuthenticatedError(); } }); } 我已经试过编写testing了,这是我迄今为止: describe('#changePassword', function() { it('should […]

Promise findOneAsync variable = {“isFulfilled”:false,“isRejected”:false}?

使用蓝鸟Promisfymongoose,我有一个Promise.map(函数与一系列if / else循环通过一个数组,以查看引用文档是否存在,否则创build一个.. 将findOneAsync的产品分配给一个variables,然后将“variable._id”分配给制作中的新文档(主承诺),控制台日志{"isFulfilled":false,"isRejected":false} 这是一个片段: for (i=0; i<items.length; i++) { var existingItem = Models.Items.findOneAsync({ item: items[i] }); console.log( "existingItem : "); console.log( JSON.stringify(existingItem) ); console.log( "existingItem._id : " + existingItem._id ); 这是一个日志: existingItem : {"isFulfilled":false,"isRejected":false} existingItem._id : undefined 为什么可能为Model.Item.findOneAsync挂起existingItemvariables?

是否仍然有必要提供MongoDB驱动程序?

这个问题的答案仍然是相关的: 我怎样才能使用蓝鸟promisify MongoDB原生的Javascript驱动程序? 我不知道从什么时候这是更新,但2.0的MongoDB的JS驱动程序在选项对象promiseLibrary有一个属性: http : promiseLibrary 大多数方法/函数都会返回一个promise,比如Cursor.toArray() 。 但是,我找不到使用这个新选项的例子,但是使用这个方法并不简单: MongoClient.connect('mongodb://URL', { promiseLibrary: require('bluebird') }); 或者这个定义是错误的? – 在这种情况下,应该如何正确定义? 更新: 代码在io.js上运行,所以我可能甚至不需要指定一个promiseLibrary作为驱动程序将使用ES6承诺? 然而,据说蓝鸟的承诺是较慢的: 为什么本机ES6承诺比bluebird更慢,更占用内存? Update2:我已经添加了蓝鸟标签 – 也许蓝鸟工作的人可以提供更多的细节,如果promisifying真的比使用MongoDB自己的实现更好?

如何使用promise在Javascript中发生exception后重试?

我正在使用蓝鸟承诺库。 我有一系列如下的promisified函数: receiveMessageAsync(params) .then(function(data)) { return [data, handleMessageAsync(request)]; }) .spread(function(data, response) { return [response, deleteMessageAsync(request)]; }) .spread(function(response, data) { return sendResponseAsync(response); }) .then(function(data) { return waitForMessage(data); }) .catch (function(err) { // handle error here }); 偶尔sendMessage将会失败,因为我们假设服务器不能响应。 我希望代码能够一直试图回应,直到成功。 你不能简单地把sendMessage包装到一个catch中,因为它实际上并没有抛出一个exception,我想,它调用了“错误”函数,在这个promisified代码中是底部的“catch”。 所以必须有一些方法来在“catch”部分“重试”发送消息。 问题是,即使我在“catch”的循环中重试,我仍然没有办法跳到promise链并执行剩下的promisified函数。 我如何处理这个? 编辑: 我重试了一个HTTPpost,结果如下所示: function retry(func) { return func() .spread(function(httpResponse) { if (httpResponse.statusCode != 200) { […]

如何在node.js中使用express来使用Promise?

我使用Express来使用Promise。 router.post('/Registration', function(req, res) { var Promise = require('promise'); var errorsArr = []; function username() { console.log("agyaaa"); return new Promise(function(resolve, reject) { User.findOne({ username: req.body.username }, function(err, user) { if(err) { reject(err) } else { console.log("yaha b agyaaa"); errorsArr.push({ msg: "Username already been taken." }); resolve(errorsArr); } }); }); } var username = username(); console.log(errorsArr); […]

如何在节点中debugging基于承诺的代码?

我使用Cujo伟大的库当我的Node项目提供Promises / A +实现,虽然这个问题不是特定于节点的。 一般来说,什么时候是好的,它可以让我编写更易于维护的代码。 但是,当我的callback意外失败(访问一个nullvariables的属性等)时,这些exception被有效地吞噬了,这似乎是由Promises / A +规范指定的。 不幸的是,这意味着我没有得到任何关于错误的反馈 (除了在那一刻执行的callback停止)。 没有错误types或消息,没有行号。 为了显示: // hypothetical asynchronous database query database.query(queryDetails).then(function(result) { var silly = 3.141592654; silly(); // TypeError: number is not a function! process(result); // this code is silently never executed }); 我可以想到一些(不可接受的)方法来解决这个问题: 为每次调用提供失败callback(将原因/exception转储到控制台) 将所有callback机构包装在试用版中 乱丢“地标日志”的代码库ala console.log('I got here 123') 我只是做错了吗? 当然,我并不是唯一一个发现基于promise的代码差的可debugging性。 有没有一个明显的解决scheme,我错过了?