2017-03-14 113 views
0

我必須使用SP.RequestExecutor.js庫。問題是我需要在同步行爲中運行異步功能。深入搜索後,我發現了awaitasync方法,但它們與Internet Explorer不兼容(IE> 9)。如何將異步功能轉換爲同步並在IE> 9和Chrome上兼容?javaScript中的異步和同步

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(); 

我需要的輸出屁股如下:

END1 END2 END3 END4。

上述代碼運行在chrome中,但在IE上拒絕awaitasync

+0

能否請你告訴你的代碼? –

+0

@Muhammad Qasim plz查看更新 – myomyo

+0

那些格式不正確的代碼 – syarul

回答

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,你coudl與Babel transpile你的代碼。

你也可以只使用Promise的情況下直接的async/await的語法糖:

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

test(); 

IE不支持原生的承諾,但他們可以很容易地與任何許多承諾圖書館出來的pollyfilled那裏。

如果你不想使用的承諾,你總是可以只修改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(); 
+0

謝謝你的第一選擇,我需要使用babel可以兼容所有瀏覽器 – myomyo