在阅读了关于promises的页面和页面之后,我仍然无法找到在类函数中返回promise(ES6规范)的正确方法。
以下是我尝试的各种选项。
utils.getMyPhotos()
返回一个承诺。
1)返回承诺及其值
profilePictures(){
return utils.getMyPhotos().then(function(result){
var photosArray = result;
photosArray.forEach(function(element) {
this._list.push(new Picture(
element.src,
element.caption
));
}, this);
return this._list;
},function(error){
console.log(error);
return error;
});
}
2)仅返回承诺'值
profilePictures(){
utils.getMyPhotos().then(function(result){
var photosArray = result;
photosArray.forEach(function(element) {
this._list.push(new Picture(
element.src,
element.caption
));
}, this);
return this._list;
},function(error){
console.log(error);
return error;
});
}
3)创建一个新的Promise并将其返回
profilePictures(){
return new Promise(function(fulfill,reject){
utils.getMyPhotos().then(function(result){
var photosArray = result;
photosArray.forEach(function(element) {
this._list.push(new Picture(
element.src,
element.caption
));
}, this);
fulfill(this._list);
},function(error){
console.log(error);
reject(error);
});
}
}
我尝试使用以上功能:
pictures.profilePictures().then(function(result){
console.log("all good");
console.dump(result);
},function(error){
console.log("errors encountered");
console.log(error);
});
在CLI中我只看到“遇到错误”,后跟一个空的error
对象。
我做错了什么?
答案 0 :(得分:2)
this._list
和返回执行此操作的结果,因为从函数名称中不清楚这是什么做。或许我可能会挑剔。无论如何,请参阅下面的推荐重构。
______
重构(1)
我已经移动了错误处理程序,以便它将捕获所有以前的处理程序中的错误。我们在记录它之后抛出错误,这样我们就可以捕获API的消耗错误,而不是在内部处理它们。虽然这可能不是你想要做的,但这意味着错误不会被神秘地吞噬。
profilePictures () {
return utils.getMyPhotos()
.then(function (result) {
return result.map(function (element) {
return new Picture(element.src, element.caption);
});
})
.then(null, function (error){
console.log(error);
throw err;
});
}
消耗它:
instance.profilePictures()
.then(function (pics) {
pics.forEach(function (pic) {
// Do something with the Picture instance
});
})
.then(null, function (err) {
// Handle the error
});
答案 1 :(得分:1)
1)返回承诺及其值
是的!您始终需要来自异步函数的return
承诺,并且需要从then
回调中返回值(或对它们的承诺)以使它们可用于链中的下一个功能。
2)只返回承诺'值
3)创建一个新的Promise并将其返回
这可行但is an antipattern。避免它。