类函数中的 Javascript ES6 承诺
Posted
技术标签:
【中文标题】类函数中的 Javascript ES6 承诺【英文标题】:Javascript ES6 promise inside class function 【发布时间】:2016-11-11 01:20:30 【问题描述】:在阅读了有关承诺的页面和页面之后,我仍然无法找出在类函数中返回承诺(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
对象。
我做错了什么?
【问题讨论】:
"只返回 promise 的值"Promise
只包含一个值,你不能解开它(除非传递给 then
的函数使用副作用),因为then
自动返回一个Promise
【参考方案1】:
-
您在这里做的是正确的事情,但是您的错误处理程序不会从其兄弟成功处理程序中捕获错误。我还建议您不要改变实例变量
this._list
并且返回执行此操作的结果,因为从函数名称中不清楚它会做什么。或者,也许我很挑剔。无论如何,请参阅下面的推荐重构。
您没有返回任何东西。 (请参阅@Bergi's answer 了解为什么返回很重要!)
是一个 Promise 反模式。 Watch out for those。
______
(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
);
【讨论】:
他使用的是原生 es6 promise,而不是 bluebird @mmm 我不认为我在重构中使用了任何 Bluebird?编辑:啊,关于反模式的链接?我不认为这不是蓝鸟特有的。 您不使用catch
而不是then(null,...)
是否有特殊原因?
@LUH3417 为了证明 then
错误处理程序不会从其兄弟成功处理程序中捕获错误。
@AaronUllal:如果有帮助,它与.catch(function(error) … )
相同。有关他所指的内容,另请参阅here。【参考方案2】:
1) 返回承诺及其价值
是的!你总是需要从异步函数中 return
承诺,从 then
回调你需要返回值(或承诺),以使它们可用于下一个函数链条。
2) 只返回承诺的值
That doesn't work.
3) 创建一个新的 Promise 并返回它
这可以工作,但is an antipattern。避免它。
【讨论】:
以上是关于类函数中的 Javascript ES6 承诺的主要内容,如果未能解决你的问题,请参考以下文章