gpt4 book ai didi

javascript - Bluebird promise 重功能的结果

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:09 26 4
gpt4 key购买 nike

我一直在使用Bluebird最近有很多关于 HAPI API 开发的事情。我刚刚遇到了我的第一个真正的问题,也许我的理解或天真让我难住了。

以下代码是我所面临的示例:-

var Promise = require('bluebird'),
stuff = require('../stuff');

module.exports = {
getSomething: function(request, reply) {
var p = Promise.resolve();
p = p.then(function() {
return db.find() //etc. etc.
});

p = p.then(function(resultFromPromise) {
//problems begin here
var data = stuff.doSomeReallyLongAndBoringFunction(resultFromPromise);
return data;
});

p.then(function(data) {
//no data here.
});
};
};

我已经评论了问题通常从哪里开始。 stuff.doSomeReallyLongAndBoringFunction() 返回一个对象(同时使用了更多的 Promise),这就是我想要访问的对象,但是 //no data here 总是在数据返回之前触发。 stuff.doSomeReallyLongAndBoringFunction() 无论如何都会继续运行并成功完成,但在代码异步后,我不知道如何 promise 该函数的返回值。

有人可以提供任何指导吗?对于问题中的任何幼稚之处,请接受我的歉意!

一如既往的帮助,非常感谢

NB 为了清楚起见,stuff.doSomeReallyLongAndBoringFunction() 本身不返回 Promise。尽管如此,我确实尝试了 return new Promise(reject, resolve) { }); 手动换行。它只是一个使用 Promise 本身(成功)来获取数据的函数。

更新 1stuff.doSomeReallyLongAndBoringFunction() 太大,无法直接发布,但它会执行以下操作:-

var Promise = require('bluebird'),
rp = require('request-promise');

module.exports = {
doSomeReallyLongAndBoringFunction: function() {
var p = Promise.resolve();
p = p.then(function() {
return db.find() //etc. etc.
});

p.then(function() {
rp(options).then(function(response){
//get some data from remote location
}).then(function(dataFromService) {
//do some jiggery pokery with said data
var marshalledData = dataFromService;
db.something.create({
Field: 'something'
}).exec(function(err, saved) {
return marshalledData;
});
});
}).catch(function(err) {

});
};
};

更新2谢谢贾斯汀的帮助。这是实际代码,也许这可能有帮助?

Promise.resolve()
.then(function() {
if(typeof utils.intTryParse(place) !== 'number') {
return foursquare.createPlaceFromFoursquare(sso, place, request, reply);
} else {
return { Place: { PlaceId: place }};
}
}).then(function(placeObj) {
console.log('Place set as', placeObj); //always returns undefined, despite function actually completing after async op...
});

最佳答案

如果您的 doSomeReallyLongAndBoringFunction 确实是异步运行的,那么按照您设置的方式运行它是没有意义的。

编辑 - 这是您的代码与重构版本的运行方式的简单说明。它已被简化,因此您需要根据实际实现填写相关部分。

var Promise = require('bluebird');
    

function myAsync() {
setTimeout(function(){
return 'done sleeping';
}, 2000);
};

//The way your code is running
Promise.resolve()
.then(function(){
return 'hello';
})
.then(function(done){
console.log(done);
return myAsync(); //your error is here
})
.then(function(done){
console.log(done);
});


//refactored
Promise.resolve()
.then(function(){
return 'hello';
})
.then(function(done){
console.log(done);

return new Promise(function(resolve) {
setTimeout(function(){
resolve('done sleeping');
}, 2000);
});
})
.then(function(done){
console.log(done);
});

关于javascript - Bluebird promise 重功能的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29106953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com