Tag: 蓝鸟

使用Promise调用API内部for循环的最佳方法

我有5亿个对象,每个对象有n个联系人,如下所示 var groupsArray = [ {'G1': ['C1','C2','C3'….]}, {'G2': ['D1','D2','D3'….]} … {'G2000': ['D2001','D2002','D2003'….]} … ] 我在nodejs中有两种实现方式,它们是基于常规的承诺,另一种是使用蓝鸟,如下所示 定期的承诺 … var groupsArray = [ {'G1': ['C1','C2','C3']}, {'G2': ['D1','D2','D3']} ] function ajax(url) { return new Promise(function(resolve, reject) { request.get(url,{json: true}, function(error, data) { if (error) { reject(error); } else { resolve(data); } }); }); } _.each(groupsArray,function(groupData){ _.each(groupData,function(contactlists,groupIndex){ // console.log(groupIndex) […]

使用承诺顺序执行function

我想依次执行一些基于数组的asynchronous函数。 我以为这会做到这一点: var Promise = require("bluebird"); Promise.cast([1,2,3]).reduce(function(_,i){ console.log("Launching " + i); return Promise.delay(Math.floor(Math.random()*1000)).then(function(){ console.log("Executing " + i); }); },0); 但是我明白了 Launching 1 Launching 2 Launching 3 Executing 2 Executing 1 Executing 3 而不是所期望的结果 Launching 1 Executing 1 Launching 2 Executing 2 Launching 3 Executing 3 我怎样才能确保在这里完全顺序执行? 请注意,我知道如何做到这一点,没有承诺,我只对完全承诺的解决scheme感兴趣。

蓝鸟承诺绑定链

我使用蓝鸟承诺,并试图允许链调用,但使用.bind()似乎并不工作。 我正进入(状态: TypeError:sample.testFirst(…)。testSecond不是函数 第一种方法是正确调用,并启动承诺链,但我还没有能够得到实例绑定工作。 这是我的testing代码: var Promise = require('bluebird'); SampleObject = function() { this._ready = this.ready(); }; SampleObject.prototype.ready = function() { return new Promise(function(resolve) { resolve(); }).bind(this); } SampleObject.prototype.testFirst = function() { return this._ready.then(function() { console.log('test_first'); }); } SampleObject.prototype.testSecond = function() { return this._ready.then(function() { console.log('test_second'); }); } var sample = new SampleObject(); sample.testFirst().testSecond().then(function() { […]

Promise.all消耗我所有的RAM

我有一个我使用的API的速率限制器,每秒允许20个请求。 所有的请求都是基于承诺的,一旦有回应,这个承诺将被API数据解决。 问题: 我设置了一个包含58k个承诺的promiseArray,全部等待响应。 所以慢慢地,内存在增加,直到内存不足。 在我的具体情况下,我不需要将parsing的数据传递给我的then() ,数据正在吃掉我所有的RAM。 代码: }).then(() => { // 2. Crawl for all clanprofiles from these leaderboards const promiseArray = [] for (let i = 0; i < clanTags.length; i++) { // Resolved data from getClanProfile() is eating up all my RAM const p = backgroundScheduler.getClanProfile(clanTags[i], true) promiseArray.push(p) } return Promise.all(promiseArray) }).then(() […]

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?

无法弄清楚如何使用asynchronous请求的收益率

我对节点有点新鲜,对于koa我是全新的。 我正在尝试使用生成器来向API执行asynchronousWeb请求,但是我无法弄清楚如何将所有的部分放在一起。 作为一个说明,我使用蓝鸟,因为我看到一些例子这样做,这似乎是一个好主意。 如果没有蓝鸟有更简单的方法去做我想做的事情,那也是很好的做法。 在我的模块中: plugin.searchForItem = function * (name) { Promise = require('bluebird'); request = Promise.promisifyAll(require('request')); console.log("making request"); yield request.getAsync('http://apisitegoeshere.com/apicall').then(function * (result) { var response = result[0]; var body = result[1]; console.log(response.statusCode); yield response; }); }; 我这样称呼它: search.searchForShow = function (name) { data = this.plugins[0].searchForItem(name); console.log("search returned: " + data); console.log("search returned2: " + […]

与蓝鸟诺言使用ldapjs

我在这里发布类似的东西: 使用ldapjs的承诺 。 不幸的是,它仍然没有解决。 这次我尝试了蓝鸟,希望能得到一些好运。 // https://www.npmjs.com/package/ldapjs var Promise = require('bluebird'); var ldap = Promise.promisifyAll( require('ldapjs') ); var config = require('./config'); var print_r = require('print_r').print_r; var my_filter = "(&(objectCategory=person)(objectClass=user)" + "(cn=" + 'someone' + "))"; var ldap_username = config.ad.username; var ldap_password = config.ad.password; var ldap_url = config.ad.url; var ldap_dn_search = config.ad.dn_search; process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; ldap.Attribute.settings.guid_format […]

Nodejs与promise保持并行

我有这样的字典: {go: ['went', 'run'], love: ['passion', 'like']} 一个键的价值是它的同义词。 而'getSynonymWords(word)'是一个asynchronous函数,它返回一个promise,其值是与传递参数相对应的同义词列表。 我怎样才能循环通过对象recursion地获得另一个对象: {went: [], run: [], passion: [], like: []} 这是我的一段代码: function getRelatedWords(dict) { return new Promise(function(resolve) { var newDict = {}; for(var key in dict){ if (dict.hasOwnProperty(key)) { var synonyms = dict[key]; Promise.map(synonyms, function (synonym) { return getSynonymWords(synonym).then(function (synonyms) { newDict[synonym] = synonyms; return newDict; }); […]

蓝鸟 – 如何早日打破承诺链

PromiseA().then(function(dataA){ if (dataA.foo == "skip me") return ?? //break promise early – don't perform next then() else return PromiseB() }).then(function(dataB){ console.log(dataB) }).catch(function (e) { //Optimal solution will not cause this method to be invoked }) 如何修改上面的代码来提前中断(然后跳过第二个())?

承诺Js:等待承诺履行

我正在与Bluebird在Node.Js中做出承诺,并想知道如何在履行承诺(完成)时作出函数返回。我想要的行为是: function getItem(){ functionReturningPromise.then(function(result){ //do some operation on result return result; }); } 但是,上述实现不会返回任何东西,因为承诺在执行时没有完成。 什么是最好的解决方法呢? getItem的目的是修改任何functionReturningPromise返回,然后返回它