mypromise.then中的函数返回值

时间:2017-06-30 16:51:49

标签: javascript json node.js return-value es6-promise

我试图从异步承诺中获取响应。然后在解析后运行一个函数来清理json响应。

然后将该值返回到promise ..然后将promise返回给在前端调用它的函数

(或者可能是一个接一个,只是一种良好的清洁模式)

vimeo = function(album_id) {

    var url = '';
    url += 'https://api.vimeo.com/users/vimeouser123/albums/';
    url += album_id;
    url += '/videos?direction=asc&sort=date';
    url += '&fields=uri,name,description,pictures';

    var options = {     
        url: url,
        method: 'GET',
        headers: {
            'Authorization': 'Bearer abc123',
            'Content-Type': 'application/json',
        }
    };

    var vimeocall = new Promise(function(resolve, reject) {
        request(options, function(err, response, body){

            if(true){resolve(body)};

        });
    });

    vimeocall.then(function(result) {
        return vimeo_clean_data(result);    
    });

    return vimeocall;
}

因此,在api调用后,promise会返回ok,即vimeo_clean_data(result);函数运行正常,console.log是已清理的代码

我可以让它回到客户端的主要承诺,但它是原始的json响应

我如何让它将干净的json返回到承诺,而承诺又返回或只是将数据返回到调用它的前端函数

(作为参考,它是一个调用它的meteor js方法,它返回了promise和数据,而不是promise.then部分)

1 个答案:

答案 0 :(得分:1)

您不想返回vimeocall,而是希望返回之前通话的回复vimeocall.then

return vimeocall.then(function(result) {
    return vimeo_clean_data(result);    
});

当您在承诺上调用.then时,它将始终返回另一个承诺,该承诺通过返回传入的回调得到解决(或被捕获的任何错误拒绝)。

https://promisesaplus.com/#point-40

  

然后必须返回一个承诺[3.3]。

promise2 = promise1.then(onFulfilled, onRejected); 
     
      
  • 如果onFulfilledonRejected返回值x,请运行承诺解决程序[[Resolve]](promise2, x)
  •   
  • 如果onFulfille d或onRejected引发异常e,则必须拒绝promise2 e作为原因。
  •   
  • 如果onFulfilled不是功能且promise1已履行,则必须使用与promise2相同的值来履行promise1
  •   
  • 如果onRejected不是功能且promise1被拒绝,则必须拒绝promise2,理由与promise1相同。
  •   

替代地

您可以在原始承诺回调中调用vimeo_clean_data()

return new Promise(function(resolve, reject) {
    request(options, function(err, response, body){

        if(err){
            //either handle the error here or:
            reject(err);
        else {
            resolve(vimeo_clean_data(body))
        };

    });
});

当您需要进行多次异步调用时,将代码拆分为多个then()调用非常有用。您可以从一个then()调用返回一个promise,并且将使用返回的promise的结果调用链中的下一个then()。 (并且不要忘记处理/传播可能的错误!)