Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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
链接包含嵌套AJAX调用的JavaScript承诺_Javascript_Promise_Es6 Promise - Fatal编程技术网

链接包含嵌套AJAX调用的JavaScript承诺

链接包含嵌套AJAX调用的JavaScript承诺,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,我希望用JavaScript承诺替换一些现有代码,我只是想确认我没有做错(或者可能有更好的方法)。我在用图书馆 我已经更新了三个函数,以使用JavaScript承诺(以前是一个嵌套的回调函数)。函数实际上应该具有双重模式,即我可以像常规函数一样使用它们并让它们返回结果,或者我可以将它们链接在一起 function func_1() { return new Promise(function(resolve, reject){ if(condition) {

我希望用JavaScript承诺替换一些现有代码,我只是想确认我没有做错(或者可能有更好的方法)。我在用图书馆

我已经更新了三个函数,以使用JavaScript承诺(以前是一个嵌套的回调函数)。函数实际上应该具有双重模式,即我可以像常规函数一样使用它们并让它们返回结果,或者我可以将它们链接在一起

function func_1()
{
    return new Promise(function(resolve, reject){
        if(condition)
        {
            resolve('1');
        }
        else
        {
            console.log('start');
            resolve(ajaxRequest(url));
        }
    });
}

function func_2(data)
{
    return new Promise(function(resolve, reject){
        if(condition)
        {
            resolve('2');
        }
        else
        {
            console.log(data.response);
            resolve(ajaxRequest(url));
        }
    });
}

function func_3(data)
{
    return new Promise(function(resolve, reject){
        if(condition)
        {
            resolve('3');
        }
        else
        {
            console.log(data.response);
            resolve(ajaxRequest(url));
        }
    });
}

func_1().then(func_2).then(func_3).then(function(data){});
if
用于检查数据是否缓存在localStorage/sessionStorage中,如果是,则函数仅返回结果。但是,在我不确定值是否已缓存的情况下(例如,第一次运行脚本),我计划将它们链接起来,然后让每个后续函数将其前一个函数的结果持久化到localStorage/sessionStorage(因此最后一行的
promise
链)。最后的
then
让我有机会保存
func_3
中的数据

根据我运行的测试,一切似乎都正常,但我只是想知道这是否是最好的方法?我如何处理可能发生在列出的3个函数中的一个或多个函数上的AJAX错误

注意:My
AjaxRequest
函数也使用相同的承诺机制,在成功时“解析”完整的XHR,在失败/错误时“拒绝”相同的完整XHR

编辑

在@Bergi的提示下,我更新了代码,使其看起来像这样(而且效果也很好):

一切似乎都正常,但我只是想知道这是否是最好的方法

除了在最低级别上(即,在承诺ajax请求时),您永远不应该真正需要使用
Promise
构造函数。您的函数应该这样编写:

function func_1() {
    if (condition) {
        return Promise.resolve('1');
    } else {
        console.log('start');
        retrun ajaxRequest(url);
    }
}
严格地说,
func_2
func_3
甚至可以
返回“2”
then
方法(将它们用作回调)可以处理这个问题。当然,总是返回承诺对象更干净

我如何处理可能发生在列出的3个函数中的一个或多个函数上的AJAX错误


将第二个函数传递给
,然后
,或使用
catch
。当承诺被拒绝时,将调用此回调,并应处理异常。

非常感谢。你这样做看起来更好,效果也一样。但是,我添加的
catch
会在特定错误时停止(请参见我的编辑),例如,如果
func_2
ajax有错误,它不会完成链。这是正常行为吗?我能改变吗?!是的,例外是“泡沫”。如果
func2
拒绝承诺,则不会调用“成功处理程序”
func3
,但下一个承诺也会立即被拒绝。要更改此行为,您需要在
func2
之后立即捕获异常,处理程序需要返回
数据
,然后继续链并传递到
func3
。谢谢。请您发布一个快速代码示例,介绍如何实现该行为?
func1()。然后(func2)。catch(函数(err){/*处理func1或func2*/return mockdata;})。然后(func3)。然后(allDone)
Awesome!工作起来很有魅力。非常感谢!
function func_1() {
    if (condition) {
        return Promise.resolve('1');
    } else {
        console.log('start');
        retrun ajaxRequest(url);
    }
}