Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从另一个承诺中的承诺返回值_Javascript_Promise - Fatal编程技术网

Javascript 从另一个承诺中的承诺返回值

Javascript 从另一个承诺中的承诺返回值,javascript,promise,Javascript,Promise,关于如何从承诺中回报价值,有很多问题,但我看不到任何答案 这是我的职责: function f1(arr, num) { return new Promise(function(resolve, reject) { resolve(data); }).then(function(data){ f2.then(function(d){ // how to return d }).catch(...);

关于如何从承诺中回报价值,有很多问题,但我看不到任何答案

这是我的职责:

function f1(arr, num) {
    return new Promise(function(resolve, reject) {
        resolve(data);
    }).then(function(data){
        f2.then(function(d){
            // how to return d 
        }).catch(...);

        function f2(data){
            return new Promise(function(resolve, reject){
                data = data + 1
                resolve (data);
            });
        };
    })
    .catch(function(){...});
}

在这种配置中,我如何返回
d

我想您正在寻找

function f1(arr, num) {
    return new Promise(function(resolve, reject) {
        resolve(data);
    }).then(function(data){
        return f2(data).then(function(d){
//      ^^^^^^ don't forget this
//               ^^^^^^ call the function
            return d;
//          ^^^^^^^^^ simply and literally return d 
        }).catch(...);

        function f2(data){
            return new Promise(function(resolve, reject){
                data = data + 1
                resolve (data);
            });
        };
    })
    .catch(function(){...});
}
或者写得更好

function f1(arr, num) {
    return Promise.resolve(data)
    .then(f2)
    .catch(function(){...});
}

function f2(data){
    return new Promise(function(resolve, reject){
        … // do some async work
        resolve(data + 1);
    });
}

你不能。您不会从回调中返回。您给该回调另一个回调,然后将
d
传递给另一个回调并在那里使用它。使用回调时,必须依赖副作用。不过,这会慢慢溶入“回调地狱”,所以要小心。“返回
d
”给谁/哪里?这里的“慢慢地”@Carcigenicate的意思是“立即”。@DaveNewton好吧,取决于你如何设置一切,你可能不会立即被咬。我设法从零开始为CS类编写了一个没有任何库的网站,但没有实现所谓的“地狱”,并且我严重依赖回调来完成异步模块加载。我知道大量使用回调是不好的,但我个人还没有看到它对我自己造成的最坏影响。我想我很幸运。应该注意的是,我对这个问题的理解很差(我的不好)。如果您是“手动”管理回调,则无法从回调返回,因为调用代码已经移动。但如果使用承诺,则可以返回,因为调用代码有一个“句柄”从中接收值。很抱歉给你带来了困惑。