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;
}
2function[query] {
var r;
myApi.exec['SomeCommand', function[response] {
r = response;
}];
while [!r] {}
return r;
}
3Trong 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;
}
4Await đã ở 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;
}
5Bạ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
}];
}
1Bạ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