Javascript ES6承诺内部类功能

时间:2016-07-08 12:53:50

标签: javascript promise es6-promise

在阅读了关于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对象。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

  1. 你在这里正在做正确的事情,但你的错误处理程序不会从其兄弟成功处理程序中捕获错误。我还建议您不要改变实例变量this._list 返回执行此操作的结果,因为从函数名称中不清楚这是什么做。或许我可能会挑剔。无论如何,请参阅下面的推荐重构。
  2. 你没有归还任何东西。 (请参阅@Bergi's answer了解返回的重要性!)
  3. 是一种承诺反模式。 Watch out for those
  4. ______

    重构(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)只返回承诺'值

That doesn't work

  

3)创建一个新的Promise并将其返回

这可行但is an antipattern。避免它。