Hướng dẫn javascript wait for callback to finish - javascript chờ gọi lại kết thúc

Tôi có một chức năng đơn giản hóa trông như thế này:

function[query] {
  myApi.exec['SomeCommand', function[response] {
    return response;
  }];
}

Về cơ bản, tôi muốn nó gọi

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
8 và trả lại phản hồi được đưa ra trong Lambda gọi lại. Tuy nhiên, mã trên không hoạt động và chỉ đơn giản là trả về ngay lập tức.

Chỉ vì một nỗ lực rất hackish, tôi đã thử dưới đây không hoạt động, nhưng ít nhất bạn có ý tưởng những gì tôi đang cố gắng đạt được:

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}

Về cơ bản, cách đi 'Node.js/sự kiện tốt là gì? Tôi muốn chức năng của mình đợi cho đến khi cuộc gọi lại được gọi, sau đó trả về giá trị được truyền cho nó.

Flimzy

70.3K15 Huy hiệu vàng132 Huy hiệu bạc171 Huy hiệu đồng15 gold badges132 silver badges171 bronze badges

hỏi ngày 15 tháng 2 năm 2011 lúc 22:30Feb 15, 2011 at 22:30

3

Cách thực hiện "Node.js /sự kiện tốt" là không chờ đợi.not wait.

Giống như hầu hết mọi thứ khác khi làm việc với các hệ thống điều khiển sự kiện như nút, chức năng của bạn sẽ chấp nhận tham số gọi lại sẽ được gọi khi sau đó tính toán hoàn tất. Người gọi không nên chờ giá trị được "trả về" theo nghĩa thông thường, mà là gửi thói quen sẽ xử lý giá trị kết quả:

function[query, callback] {
  myApi.exec['SomeCommand', function[response] {
    // other stuff here...
    // bla bla..
    callback[response]; // this will "return" your value to the original caller
  }];
}

Vì vậy, bạn không sử dụng nó như thế này:

var returnValue = myFunction[query];

Nhưng như thế này:

myFunction[query, function[returnValue] {
  // use the return value here instead of like a regular [non-evented] return value
}];

Đã trả lời ngày 15 tháng 2 năm 2011 lúc 22:35Feb 15, 2011 at 22:35

JakobjakobJakob

23.8K7 Huy hiệu vàng45 Huy hiệu bạc56 Huy hiệu Đồng7 gold badges45 silver badges56 bronze badges

13

Một cách để đạt được điều này là kết thúc cuộc gọi API thành một lời hứa và sau đó sử dụng

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
9 để chờ kết quả.

// Let's say this is the API function with two callbacks,
// one for success and the other for error.
function apiFunction[query, successCallback, errorCallback] {
    if [query == "bad query"] {
        errorCallback["problem with the query"];
    }
    successCallback["Your query was "];
}

// Next function wraps the above API call into a Promise
// and handles the callbacks with resolve and reject.
function apiFunctionWrapper[query] {
    return new Promise[[resolve, reject] => {
        apiFunction[query,[successResponse] => {
            resolve[successResponse];
        }, [errorResponse] => {
            reject[errorResponse];
        }];
    }];
}

// Now you can use await to get the result from the wrapped api function
// and you can use standard try-catch to handle the errors.
async function businessLogic[] {
    try {
        const result = await apiFunctionWrapper["query all users"];
        console.log[result];
        
        // the next line will fail
        const result2 = await apiFunctionWrapper["bad query"];
    } catch[error] {
        console.error["ERROR:" + error];
    }
}

// Call the main function.
businessLogic[];

Output:

Your query was 
ERROR:problem with the query

Đã trả lời ngày 3 tháng 7 năm 2018 lúc 21:47Jul 3, 2018 at 21:47

TimotimoTimo

5.0545 Huy hiệu vàng33 Huy hiệu bạc38 Huy hiệu đồng5 gold badges33 silver badges38 bronze badges

3

Kiểm tra điều này: //github.com/luciotato/waitfor-es6

Mã của bạn có Wait.for: [Yêu cầu Máy phát điện, -Cờ -Harmony]

function* [query] {
  var r = yield wait.for[ myApi.exec, 'SomeCommand'];
  return r;
}

Đã trả lời ngày 6 tháng 12 năm 2013 lúc 14:27Dec 6, 2013 at 14:27

Lucio M. Tatolucio M. TatoLucio M. Tato

5.4612 Huy hiệu vàng30 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges30 silver badges30 bronze badges

0

Nếu bạn muốn nó rất đơn giản và dễ dàng, không có thư viện ưa thích nào, chờ đợi các chức năng gọi lại được thực thi trong nút, trước khi thực thi một số mã khác, giống như sau:

//initialize a global var to control the callback state
var callbackCount = 0;
//call the function that has a callback
someObj.executeCallback[function [] {
    callbackCount++;
    runOtherCode[];
}];
someObj2.executeCallback[function [] {
    callbackCount++;
    runOtherCode[];
}];

//call function that has to wait
continueExec[];

function continueExec[] {
    //here is the trick, wait until var callbackCount is set number of callback functions
    if [callbackCount < 2] {
        setTimeout[continueExec, 1000];
        return;
    }
    //Finally, do what you need
    doSomeThing[];
}

Đã trả lời ngày 18 tháng 12 năm 2016 lúc 23:59Dec 18, 2016 at 23:59

Marquinho Pelimarquinho PeliMarquinho Peli

4.5854 Huy hiệu vàng23 Huy hiệu bạc21 Huy hiệu đồng4 gold badges23 silver badges21 bronze badges

Nếu bạn không muốn sử dụng gọi lại thì bạn có thể sử dụng mô -đun "Q".

Ví dụ:

function getdb[] {
    var deferred = Q.defer[];
    MongoClient.connect[databaseUrl, function[err, db] {
        if [err] {
            console.log["Problem connecting database"];
            deferred.reject[new Error[err]];
        } else {
            var collection = db.collection["url"];
            deferred.resolve[collection];
        }
    }];
    return deferred.promise;
}


getdb[].then[function[collection] {
   // This function will be called afte getdb[] will be executed. 

}].fail[function[err]{
    // If Error accrued. 

}];

Để biết thêm thông tin, hãy tham khảo điều này: //github.com/kriskowal/q

Moffeltje

4.3344 Huy hiệu vàng30 Huy hiệu bạc55 Huy hiệu Đồng4 gold badges30 silver badges55 bronze badges

Đã trả lời ngày 17 tháng 4 năm 2015 lúc 7:17Apr 17, 2015 at 7:17

Vishal Patelvishal Patelvishal patel

7821 Huy hiệu vàng6 Huy hiệu bạc20 Huy hiệu đồng1 gold badge6 silver badges20 bronze badges

Lưu ý: Câu trả lời này có lẽ không nên được sử dụng trong mã sản xuất. Đó là một hack và bạn nên biết về những hàm ý.

Có mô -đun UVRun [được cập nhật cho các phiên bản NodeJS mới hơn ở đây] nơi bạn có thể thực hiện một vòng lặp duy nhất của vòng lặp sự kiện chính của Libuv [là vòng chính NodeJS].

Mã của bạn sẽ trông như thế này:

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
0

[Bạn có thể sử dụng thay thế

function[query, callback] {
  myApi.exec['SomeCommand', function[response] {
    // other stuff here...
    // bla bla..
    callback[response]; // this will "return" your value to the original caller
  }];
}
0. Điều đó có thể tránh được một số vấn đề với việc chặn, nhưng mất 100% CPU.]

Lưu ý rằng cách tiếp cận này làm mất hiệu lực toàn bộ mục đích của nodejs, tức là để có mọi thứ không đồng bộ và không chặn. Ngoài ra, nó có thể tăng độ sâu gọi của bạn rất nhiều, vì vậy bạn có thể kết thúc với việc tràn chồng. Nếu bạn chạy chức năng như vậy một cách đệ quy, bạn chắc chắn sẽ gặp rắc rối.

Xem các câu trả lời khác về cách thiết kế lại mã của bạn để thực hiện nó "đúng".

Giải pháp này ở đây có lẽ chỉ hữu ích khi bạn thử nghiệm và ESP. muốn có mã đồng bộ và mã nối tiếp.

Mattsven

20.9k10 Huy hiệu vàng67 Huy hiệu bạc104 Huy hiệu đồng10 gold badges67 silver badges104 bronze badges

Đã trả lời ngày 27 tháng 3 năm 2014 lúc 7:32Mar 27, 2014 at 7:32

AlbertalbertAlbert

62,8K59 Huy hiệu vàng229 Huy hiệu bạc368 Huy hiệu Đồng59 gold badges229 silver badges368 bronze badges

Vì Node 4.8.0, bạn có thể sử dụng tính năng của ES6 được gọi là Trình tạo. Bạn có thể theo dõi bài viết này cho các khái niệm sâu sắc hơn. Nhưng về cơ bản, bạn có thể sử dụng máy phát điện và hứa hẹn sẽ hoàn thành công việc này. Tôi đang sử dụng Bluebird để hứa và quản lý trình tạo.

Mã của bạn sẽ ổn như ví dụ dưới đây.

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
1

Đã trả lời ngày 9 tháng 3 năm 2017 lúc 12:30Mar 9, 2017 at 12:30

Đó là năm 2020 và rất có thể API đã có phiên bản dựa trên lời hứa hoạt động với AIDIT. Tuy nhiên, một số giao diện, đặc biệt là bộ phát sự kiện sẽ yêu cầu cách giải quyết này:

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
2
function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
3

Trong trường hợp cụ thể này, nó sẽ là:

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
4

Await đã ở New Node.js phát hành trong 3 năm qua [kể từ V7.6].

Đã trả lời ngày 19 tháng 12 năm 2020 lúc 10:19Dec 19, 2020 at 10:19

MACIEJ KRAWCCHIKMACIEJ KRAWCCHOKMaciej Krawczyk

Huy hiệu vàng 13K546 Huy hiệu bạc57 Huy hiệu đồng5 gold badges46 silver badges57 bronze badges

Giả sử bạn có một chức năng:

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
5

Bạn có thể sử dụng các cuộc gọi lại như thế này:

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
6

Đã trả lời ngày 11 tháng 7 năm 2013 lúc 7:50Jul 11, 2013 at 7:50

1

Sử dụng async và chờ đợi nó dễ dàng hơn rất nhiều.

function[query] {
  var r;
  myApi.exec['SomeCommand', function[response] {
    r = response;
  }];
  while [!r] {}
  return r;
}
7

Đã trả lời ngày 2 tháng 5 năm 2020 lúc 8:51May 2, 2020 at 8:51

SaisuryasaisuryaSaiSurya

9485 Huy hiệu bạc13 Huy hiệu đồng5 silver badges13 bronze badges

1

Điều đó đánh bại mục đích của IO không chặn-bạn đang chặn nó khi nó không cần chặn

function[query, callback] {
  myApi.exec['SomeCommand', function[response] {
    // other stuff here...
    // bla bla..
    callback[response]; // this will "return" your value to the original caller
  }];
}
1

Bạn nên làm tổ lại các cuộc gọi lại của mình thay vì buộc Node.js phải chờ hoặc gọi một cuộc gọi lại khác bên trong cuộc gọi lại nơi bạn cần kết quả của

function[query, callback] {
  myApi.exec['SomeCommand', function[response] {
    // other stuff here...
    // bla bla..
    callback[response]; // this will "return" your value to the original caller
  }];
}
2.

Rất có thể, nếu bạn cần buộc chặn, bạn đang nghĩ về kiến ​​trúc của mình sai.

Đã trả lời ngày 15 tháng 2 năm 2011 lúc 22:33Feb 15, 2011 at 22:33

5

Làm thế nào để bạn chờ đợi chức năng gọi lại kết thúc?

Sử dụng async/chờ đợi để chờ một chức năng kết thúc trước khi tiếp tục thực hiện. Một cách khác để chờ đợi một chức năng thực thi trước khi tiếp tục thực hiện trong môi trường không đồng bộ trong JavaScript là sử dụng Async/Wait. to Wait for a Function to Finish Before Continuing Execution. Another way to wait for a function to execute before continuing the execution in the asynchronous environment in JavaScript is to use async/wait .

JavaScript có chờ chức năng kết thúc trước khi tiếp tục không?

Sớm hay muộn, bạn sẽ bắt gặp nhu cầu làm cho JavaScript đợi cho đến khi một hàm kết thúc trước khi tiếp tục thực thi nhiều mã hơn. Trong JavaScript, điều này đôi khi có thể là một thách thức, bởi vì JavaScript không chờ đợi mã mà nó biết sẽ mất một thời gian để hoàn thành.JavaScript doesn't wait for code that it knows will take some time to complete.

Làm thế nào để bạn chờ đợi Async hoàn thành JavaScript?

Nhà điều hành đang chờ đợi được sử dụng để chờ đợi một lời hứa.Nó chỉ có thể được sử dụng bên trong một khối async.Từ khóa đang chờ làm cho JavaScript đợi cho đến khi lời hứa trả về kết quả.Cần lưu ý rằng nó chỉ làm cho khối chức năng Async chờ đợi chứ không phải toàn bộ thực thi chương trình.The keyword Await makes JavaScript wait until the promise returns a result. It has to be noted that it only makes the async function block wait and not the whole program execution.

Làm thế nào để bạn chờ đợi một settimeout để hoàn thành?

Sử dụng hàm setTimeout []: Để chờ đợi một lời hứa kết thúc trước khi trả lại biến, hàm có thể được đặt bằng setTimeout [], để hàm chờ vài mili giây.Việc sử dụng hàm async hoặc Await []: Phương thức này có thể được sử dụng nếu thời gian chính xác cần thiết trong setTimeout [] không thể được chỉ định.: In order to wait for a promise to finish before returning the variable, the function can be set with setTimeout[], so that the function waits for a few milliseconds. Use of async or await[] function: This method can be used if the exact time required in setTimeout[] cannot be specified.

Bài Viết Liên Quan

Chủ Đề