Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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 Promise结果及其处理分为两个单独的文件_Javascript_Ajax_Asynchronous_Promise - Fatal编程技术网

Javascript Promise结果及其处理分为两个单独的文件

Javascript Promise结果及其处理分为两个单独的文件,javascript,ajax,asynchronous,promise,Javascript,Ajax,Asynchronous,Promise,在我的脚本中,我需要发出一个XMLrequest,从服务器获取响应(如果已解析),对其进行解析,并将解析后的结果放入一个变量中 直到后来,有了这个变量,我才能做很多事情 因此,基本上,我正在尝试将此类解析器对象的创建与代码的其余部分分开,以便: 将上述过程放入外部脚本中的函数中,我可以随时调用该脚本 没有在.then()方法中包含所有代码 将我的代码组织到逻辑文件中,每个文件用于特定的任务 所以我提出了这段代码(只是一个示例)来解释我的需求。 由于我对异步编程还比较陌生,考虑到在我的情况下响

在我的脚本中,我需要发出一个XMLrequest,从服务器获取响应(如果已解析),对其进行解析,并将解析后的结果放入一个变量中

直到后来,有了这个变量,我才能做很多事情

因此,基本上,我正在尝试将此类解析器对象的创建与代码的其余部分分开,以便:

  • 将上述过程放入外部脚本中的函数中,我可以随时调用该脚本
  • 没有在
    .then()方法中包含所有代码
  • 将我的代码组织到逻辑文件中,每个文件用于特定的任务
所以我提出了这段代码(只是一个示例)来解释我的需求。
由于我对异步编程还比较陌生,考虑到在我的情况下响应应该非常快,所以这样做可以吗

如果可以的话,我会把它放在一个单独的文件中,以便能够导入它并从我需要的任何地方调用
testing()
(或任何名称)

功能延迟(输入){
返回新承诺(功能(解决、拒绝){
//这里有一些异步操作
setTimeout(函数(){
//用一些价值来解决承诺
解析(输入+10);
}, 500);
});
}
函数测试(){delay(5).then(result=>{returndocument.write(result)}});

测试()承诺(承诺链)的全部意义在于通过展平你的“链”来逃离“嵌套地狱”,因此,是的,当你的承诺链解析代码块时,它返回的承诺是
然后是
-able。我希望这有助于说明:

someAsyncHttpRequest(parameter) // <- Returns Promise
    .then(result => {
        // do something with result data, i.e. extract response data, 
        //  mutate it, save it, do something else based on value
        ...
        // You can even return a Promise
        return Promise.resolve(mutatedData);
    })
    .then(newData => {  // <- mutadedData passed as parameter
        // do new stuff with new data, etc... even reject
        let rejectData = processNewData(newData);
        return Promise.reject(rejectData);
    })
    .catch(err => {
        console.log('Any caught promise rejection no matter where it came from:', err);
    })
    .finally(() => {// You can even run this code no matter what});
所以对你来说:

function delay(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

**async** function testing() { // Declare this an asynchronous function
    let value = **await** delay(5); // Now you can await the resolution of the Promise
    console.log(value); // Outputs resolved value 15!
    return value; // Just returns resolved Promise
}

var test = testing();

console.log(test); 
/** Outputs the Promise!
   Promise {<pending>}
     __proto__:Promise
     [[PromiseStatus]]:"resolved"
     [[PromiseValue]]:15
*/

test.then(console.log)); // Outputs returned resolved value, 15
功能延迟(输入){
返回新承诺(功能(解决、拒绝){
//这里有一些异步操作
setTimeout(函数(){
//用一些价值来解决承诺
解析(输入+10);
}, 500);
});
}
**异步**函数测试(){//声明此函数为异步函数
让value=**等待**延迟(5);//现在您可以等待承诺的解决
console.log(value);//输出解析值15!
返回值;//仅返回已解析的承诺
}
var测试=测试();
控制台日志(测试);
/**兑现诺言!
承诺{}
__承诺
[[PromiseStatus]]:“已解决”
[[承诺价值]]:15
*/
test.then(console.log));//输出返回解析值,15

你的问题是什么?代码很好,“这样做会好吗?”。这个问题的意思是:“我是否遗漏了一些真正需要注意的东西,或者这样做完全没有问题。例如:有没有更好的(或完全不同的)方法呢?”我找不到任何例子可以将检索承诺响应的逻辑和将其结果分为两个单独的文件。还有其他方法可以做到这一点,像ES6异步函数和
等待
。魔鬼在细节中。您的小片段很好,如果不看到它,就很难知道您的实际应用程序是否能够正常工作。如果在异步函数中设置变量,则需要确保在实际设置变量之前不会尝试使用它。请看,如果我理解正确,您似乎有两个问题:(1)如何不从承诺中获取未定义的返回值,以及(2)是否有方法测试正在运行的承诺的挂起状态。第一个问题的答案是按照@Barmar的建议去做,我的例子是。。。使用异步/等待。对于第二个问题,我只是在谷歌上搜索了一下,似乎有很多方法/示例可以检查承诺的待定状态,但它们似乎都与承诺的模式背道而驰。。。只是等待它解决和“回调”,或拒绝。。。没有强有力的理由试图监控承诺的状态。将wait与
then
混合在一起是很奇怪的,就像你上一个例子一样。为什么不将
someAsyncHttpRequest
的结果分配给
asyncValue
?这就是代码的作用
someAsyncHttpRequest
返回包含要保存的结果的承诺。承诺使用回调,因此在没有等待的情况下,javascript将愉快地处理请求并继续执行。。。使用wait时,它会暂停函数的执行,并首先等待承诺链的解析,然后再继续。对不起,我不太清楚。我的观点是,这更像是aync/await的惯用用法:
让asyncValue=await someAsyncHttpRequest(参数)
。没有必要使用
then()
哦,我明白你的意思了。我只是试图演示如何在链中设置变量,因此使用传递的结果有点过于简单。
function delay(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

**async** function testing() { // Declare this an asynchronous function
    let value = **await** delay(5); // Now you can await the resolution of the Promise
    console.log(value); // Outputs resolved value 15!
    return value; // Just returns resolved Promise
}

var test = testing();

console.log(test); 
/** Outputs the Promise!
   Promise {<pending>}
     __proto__:Promise
     [[PromiseStatus]]:"resolved"
     [[PromiseValue]]:15
*/

test.then(console.log)); // Outputs returned resolved value, 15