异步/等待nodejs功能

时间:2018-11-22 13:02:24

标签: node.js async-await

我有以下namespace Services { interface kvkResult { handelsnaam: string; dossiernummer: number; straat: string; huisnummer: number; huisnummertoevoeging: string; postcode: string; plaats: string; ModelId: string; displayname: string; ContactPersonModelId: string; } interface Contact { ModelId: string; displayname: string; } export class kvkFactory { private ctlCompanyName: string; private ctlContainerName: string; private ctlCoc: string; private ctlAddress: string; private ctlAddressNumber: string; private ctlAddressNumberSuffix: string; private ctlZipCode: string; private ctlTown: string; private ctlModelId: string; private ctlContactPersonModelId: string; /** Function to Fetch data from kvk api @ctlSearch: Input control for coc organisations @ctlAutocompleteContainer: output control to display organisations result. @ctlCocClass: output text control for Kamer voor koophandel nummer @ctlAddressClass: output text control for address organisation @ctlZipCodeClass: output text contorl for zip code organisation @ctlTownClass: output text contorl for town of settlement organisation */ constructor(ctlSearch: string, ctlAutocompleteContainer: string, ctlCompanyNameElement: string, ctlCocElement: string, ctlAddressElement: string, ctlAddressNumberElement: string, ctlAddressNumberSuffixElement: string, ctlZipCodeElement: string, ctlTownElement: string, ctlModelIdElement?: string, ctlContactPersonModelIdElement?: string, webapiurlforsearch?: string) { this.ctlCompanyName = ctlSearch; this.ctlContainerName = ctlAutocompleteContainer; this.ctlCompanyName = ctlCompanyNameElement; this.ctlCoc = ctlCocElement; this.ctlAddress = ctlAddressElement; this.ctlAddressNumber = ctlAddressNumberElement; this.ctlAddressNumberSuffix = ctlAddressNumberSuffixElement; this.ctlZipCode = ctlZipCodeElement; this.ctlTown = ctlTownElement; this.ctlModelId = ctlModelIdElement; this.ctlContactPersonModelId = ctlContactPersonModelIdElement; $(this.ctlCompanyName).keyup(function () { clearTimeout(this.typingTimer); this.typingTimer = setTimeout(() => { kvkfactory.searchKvk(webapiurlforsearch); }, this.doneTypingInterval); }); } typingTimer: number; datafound = (data: any): void => { let resultobject: ResultObject<kvkResult> = data; let companies = resultobject.Records; $(kvkfactory.ctlContainerName).empty(); $(kvkfactory.ctlContainerName).show(); $(kvkfactory.ctlContainerName).append('<table>'); $.each(companies, function (i, item) { let entry: kvkResult = item; $('table', kvkfactory.ctlContainerName).append("<tr class=\"auto-complete-item\" data-modelid=\"" + entry.ModelId + " \" data-contactpersonmodelid=\"" + entry.ContactPersonModelId +" \"data-id=\"" + i + "\"><td>" + entry.handelsnaam + "</td><td>" + entry.straat + " " + entry.huisnummer + "</td><td>" + entry.postcode + "</td><td>" + entry.plaats + "</td></tr>"); }); $(kvkfactory.ctlContainerName).append('</table>'); $(".auto-complete-item").on("click", function () { let id: string = $(this).data("id"); let contactidnumber = 1; let contactid: string = $(this).data('contactidnumber'); let modelid: string = $(this).data("modelid"); let contacts = companies[contactidnumber]; let organisationmodelid: string[] = null; let count: number = 0; let company: kvkResult = companies[id]; if (kvkfactory.ctlModelId != undefined && modelid!=null ) { $(kvkfactory.ctlModelId).val(modelid); $(kvkfactory.ctlContactPersonModelId).val(organisationmodelid); } $(kvkfactory.ctlCompanyName).val(company.handelsnaam); $(kvkfactory.ctlCoc).val(company.dossiernummer); $(kvkfactory.ctlAddress).val(company.straat); $(kvkfactory.ctlAddressNumber).val(company.huisnummer); $(kvkfactory.ctlAddressNumberSuffix).val(company.huisnummertoevoeging); $(kvkfactory.ctlZipCode).val(company.postcode); $(kvkfactory.ctlTown).val(company.plaats); $(kvkfactory.ctlModelId).val(company.ModelId); $(".auto-complete-container").hide(); Materialize.updateTextFields(); }); $(document).mouseup(function (e) { let container = $(".auto-complete-container"); if (!container.is(e.target) // if the target of the click isn't the container... && container.has(e.target).length === 0) // ... nor a descendant of the container { container.hide(); } }); }; doneTypingInterval: number = 800; searchKvk = (webapiurlforsearch?: string): void => { if ($(this.ctlCompanyName).val().length >= 3) { if (webapiurlforsearch == undefined) { webapiurlforsearch = variables.websiteurl + "/Kvk/Getdata"; } let val = $(this.ctlCompanyName).val(); webApi.Execute(HttpRequestType.Get, webapiurlforsearch, { name: val }, this.datafound, null); } else { $(".auto-complete-container").empty(); } } } 的代码段。

async/await

当我浏览以上代码片段时,我期望输出为1、2、3、4。但是我得到4、2、3、1。我在这里错过了什么吗?

节点版本async function test1 () { setTimeout(() => { console.log("1") }, 2000); } async function test2 () { setTimeout(() => { console.log("2") }, 1000); } async function test3 () { setTimeout(() => { console.log("3") }, 1500); } async function test4 () {console.log("4")} async function run () { await test1() await test2() await test3() await test4() } run()

1 个答案:

答案 0 :(得分:5)

await附加test1等与直接await附加setTimeout(...)相同。 setTimeout不是基于承诺的,并且在承诺链中也没有考虑。

await test1()等导致一滴答的延迟,run()承诺立即得到解决。

为了使代码按预期工作,应该为:

function test1 () {
  return new Promise(resolve => setTimeout(() => {
    console.log("1");
    resolve();
  }, 2000));
}

test1等。不必成为async,因为它们不能从async函数创建的承诺中受益。