Я пытаюсь создать приложение с использованием Node.Js, которое требует поддержки собственного модуля.Я использовал библиотеку libuv через приложение и смог заставить работать большинство асинхронных методов, за исключением той части, где мне пришлось реализовать обратный вызов события progress.Я хочу реализовать обратный вызов события progress асинхронно и без блокировки цикла событий Node.js.
Вот фрагменты кода:
native.cc
#include <node.h>
#include <uv.h>
#include "nbind/nbind.h"
using v8::Isolate;
using v8::HandleScope;
int FileProgressCallback(uint64_t const sent, uint64_t const total, void const *const data) {
nbind::cbFunction cb = *((nbind::cbFunction *) data);
cb(sent, total);
return 0;
}
class WorkerFileTransfer {
public:
WorkerFileTransfer(std::string path, nbind::cbFunction cb) :
callback(cb), path(path) {};
uv_work_t worker;
nbind::cbFunction callback;
bool error;
std::string errorMsg;
std::string path;
};
void FileTransferDone(uv_work_t *order, int status) {
Isolate *isolate = Isolate::GetCurrent();
HandleScope handleScope(isolate);
WorkerFileTransfer *work = static_cast< WorkerFileTransfer * >( order->data );
if (work->error) {
work->callback.call<void>(work->errorMsg.c_str(), work->output);
} else {
ThirdPartyLibraryFileCopy(work->path.c_str(), FileProgressCallback, (const void *) &work->callback);
}
// Memory cleanup
work->callback.reset();
delete work;
}
void FileTransferRunner(uv_work_t *order) {
WorkerFileTransfer *work = static_cast< WorkerFileTransfer * >( order->data );
try {
work->output = true;
}
catch (...) {
work->error = true;
work->errorMsg = "Error occured while executing the method...";
}
}
void FileTransfer(const std::string path, nbind::cbFunction &callback) {
WorkerFileTransfer *work = new WorkerFileTransfer(path, callback);
work->worker.data = work;
work->path = path;
work->error = false;
uv_queue_work(uv_default_loop(), &work->worker, FileTransferRunner, FileTransferDone);
}
function(FileTransfer);
test.js
FileTransfer(
'/path/file.txt',
(sent, total) => {
console.log(`sent`, sent);
console.log('total', total);
}
);
Мне удалось выполнить передачу файла из-за строк ниже, но цикл событий Node.Js здесь блокируется.
void FileTransferDone(uv_work_t *order, int status) {
...
ThirdPartyLibraryFileCopy(work->path.c_str(), FileProgressCallback, (const void *) &work->callback);
...
}
Когда я перемещаю строку ThirdPartyLibraryFileCopy(work->path.c_str(), FileProgressCallback, (const void *) &work->callback);
в метод FileTransferRunner(uv_work_t *order)
, я не получаю никакого вывода в функции обратного вызова javascript.
Как получить значения прогресса в обратном вызове javascriptфункция, асинхронно, без блокировки цикла событий Node.Js?