类函数中的 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 承诺的主要内容,如果未能解决你的问题,请参考以下文章

ES6新特性之 promise

ES6新特性之 promise

JavaScript ES6承诺循环[重复]

对Javascript 类原型链继承的理解

Javascript ES6 会承诺支持'done' api吗?

ES6中的Promise