2017-07-17 79 views
1

我希望更好地瞭解爲什麼下面的示例的內部預期:如何做一個異步摩卡測試決心,而不返回一個承諾或調用完成回調

describe('async await',() => { 
    it('resolves without return', async() => { 
     await asyncOperation(); 
    }); 
}); 

function asyncOperation() { 
    return new Promise((resolve) => { 
     setTimeout(() => { 
      resolve(); 
     }, 123); 
    }); 
} 

通常一個異步摩卡測試必須返回一個承諾(或執行完成的回調),但在這個例子中沒有返回,但摩卡測試仍然有效。這是如何工作的?

回答

5

async documentation

的異步函數聲明定義的異步函數,該函數返回一個AsyncFunction對象。

說明

當一個異步函數被調用,它返回一個無極。當異步函數返回一個值時,Promise將用返回的值解析。當異步函數拋出異常或某個值時,Promise將被拋出的值拒絕。

這意味着在你的情況下,返回Promise,這就是爲什麼你的測試工作。

1

當您使用async關鍵字,你是隱式返回的任何類型的你實際上是在功能的return語句中使用(在這種情況下,不必返回任何一個Promise,所以這是一個簡單的沒有一個Promise,或Promise<void>如果你在TypeScript中)。

在內部,使用async/await的函數可以展開到多個異步延續中,並在關鍵字await的每次使用中進行拆分。當您承諾完成await時,該功能的其餘部分將恢復。瞭解像Babel這樣的譯員如何展開你的代碼可能是有益的。

此代碼:

function asyncOperation() { 
    return new Promise((resolve) => { 
     setTimeout(() => { 
      resolve(); 
     }, 123); 
    }); 
} 

async() => { 
    await asyncOperation(); 
} 

被transpiled爲純ES5爲:

"use strict"; 

function _asyncToGenerator(fn) { return function() { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } 

function asyncOperation() { 
    return new Promise(function (resolve) { 
     setTimeout(function() { 
      resolve(); 
     }, 123); 
    }); 
} 

_asyncToGenerator(regeneratorRuntime.mark(function _callee() { 
    return regeneratorRuntime.wrap(function _callee$(_context) { 
     while (1) { 
      switch (_context.prev = _context.next) { 
       case 0: 
        _context.next = 2; 
        return asyncOperation(); 

       case 2: 
       case "end": 
        return _context.stop(); 
      } 
     } 
    }, _callee, undefined); 
})); 

說難聽_asyncToGenerator調用曾經是你美麗的異步功能。它已被展開成明確的延續(you can try爲函數添加更多等待點和邏輯並查看傳輸代碼如何更改)。

相關問題