javaScript中的异步和同步

时间:2017-03-14 07:11:54

标签: javascript asynchronous

我必须使用SP.RequestExecutor.js库。问题是我需要在同步行为中运行异步功能。深度搜索后,我发现了Requiredawait方法,但它们与Internet Explorer(IE> 9)不兼容。如何将异步函数转换为同步并在IE> 9和Chrome上兼容?

async

我需要输出结果如下:

  

END1   END2   END3   END4。

以上代码在Chrome中运行,但在IE上拒绝function executorRun() { console.log('end2'); var executor = new SP.RequestExecutor('path'); var result=[]; executor.executeAsync({ url: 'URL', method: "POST", headers: { "accept": "application/json;odata=verbose", "content-type": "application/json;odata=verbose", }, data: JSON.stringify(requestData), success: function (data) { console.log('end3') console.log(data);//Debug statement //Handle data and store in result }, error: function (error) { console.log(error); } }); return result; } async function test () { console.log('end1'); const data = await executorRun(); console.log('end4'); } test(); await

1 个答案:

答案 0 :(得分:0)

要使await有效,executorRun需要返回Promise

function executorRun() {
  console.log('end2');
  return new Promise(function (resolve, reject) {
    var executor = new SP.RequestExecutor('path'); 

    executor.executeAsync({    
        url: 'URL',
        method: "POST",
        headers: {
            "accept": "application/json;odata=verbose",
            "content-type": "application/json;odata=verbose",      
        },
        data: JSON.stringify(requestData),
        success: function (data) {
          console.log('end3');
          console.log(data);//Debug statement 
          //Handle data and store in result       
          resolve(data);
        },       
        error: function (error) {
          reject(error);
          console.log(error);
        }
     });
  });
}

async function test () { 
  console.log('end1');
  const data = await executorRun();
  console.log('end4');
}

test();

要在IE9中使用async / await,您可以使用Babel转换代码。

您也可以直接使用Promise而不使用async / await的句法糖:

function test () { 
  console.log('end1');
  executorRun().then(function (data) {
    console.log('end4');
  });
}

test();

IE本身并不支持Promises,但可以很容易地使用任何一个Promise库来完善它们。

如果您不想使用Promises,您可以随时修改excecutorRun以接受回调:

function executorRun(callback) {
  console.log('end2');
    var executor = new SP.RequestExecutor('path'); 

    executor.executeAsync({    
        url: 'URL',
        method: "POST",
        headers: {
            "accept": "application/json;odata=verbose",
            "content-type": "application/json;odata=verbose",      
        },
        data: JSON.stringify(requestData),
        success: function (data) {
          console.log('end3');
          console.log(data);//Debug statement 
          //Handle data and store in result       
          callback(data);
        },       
        error: function (error) {
          console.log(error);
        }
     });
}

function test () { 
  console.log('end1');

  executorRun(function (data) {
    console.log('end4');
    console.log(data);
  });
}

test();