如何在旧的Promise + then链中创建新的Promise + then语义链,但不是在闭包中?

时间:2015-07-31 17:17:59

标签: javascript promise

假设我有这样的场景:

  1. 请求在promise中发布一些数据;
  2. a)如果响应数据没问题 - 完成Promise +然后链;

    b)如果响应数据不正确 - 制作新的Promise +然后链 - 返回第2点。

  3. 和像这样的代码

    var _p;
    function make_promise(){
        return new Promise(function(resolve, reject){
            //get data 
            var data = 'some data';
            resolve(data);
        })
    }
    
    
    function handle_response(data) {
        var _p;
        if (data == 'some data'){
            console.log(data);
            //finish then chain
        }
        if (data != 'some data') {
            _p = make_promise()
                .then(handle_response);
        }
    }
    
    _p = make_promise()
        .then(handle_respone);
    

    在执行流程b)时,每次迭代选择此代码将在handle_response函数内创建新的承诺。 这个新承诺会取代旧的还是会在关闭时保存? 如果新的承诺将被保存在关闭中如何避免这种情况?不保存_p变量的新承诺?

1 个答案:

答案 0 :(得分:0)

我认为你真正想要的是

function getResponse() {
    return make_promise().then(function handle_response(data) {
        if (data == 'some data'){
            console.log(data);
            //finish then chain
        } else {
            return getResponse(); // repeat, recursively
        }
    }
}

var p = getResponse();

重要部分是return,它使得返回的保证与递归调用的结果一起解决 - 也就是说,p将始终只在“链”被“完成”时才会实现。 / p>