路泰科技体检小程序UI设计新版本
1
wwl
6 天以前 a6cdbcfe28fcc40ebb4919f57d60fb20122e8e57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#ifndef PROMISE_RUNNER_H
#define PROMISE_RUNNER_H
 
#include <node_api.h>
#include "wasm/include.h"
#include <napi.h>
 
using namespace Napi;
 
class PromiseRunner {
public:
  const Env env;
  Promise::Deferred deferred;
 
  PromiseRunner(Env env) : env(env), deferred(Promise::Deferred::New(env)) {
    napi_status status = napi_create_async_work(env, nullptr, env.Undefined(),
                                                onExecute, onWorkComplete, this, &work);
    if (status != napi_ok) {
      work = nullptr;
      const napi_extended_error_info *error_info = 0;
      napi_get_last_error_info(env, &error_info);
      if (error_info->error_message) {
        Error::New(env, error_info->error_message).ThrowAsJavaScriptException();
      } else {
        Error::New(env).ThrowAsJavaScriptException();
      }
    }
  }
 
  virtual ~PromiseRunner() {}
 
  Value queue() {
    if (work) {
      napi_status status = napi_queue_async_work(env, work);
      if (status != napi_ok) {
        onError(Error::New(env));
      }
    }
 
    return deferred.Promise();
  }
 
private:
  napi_async_work work;
  std::string error;
 
  static void onExecute(napi_env env, void *this_pointer) {
    PromiseRunner* self = (PromiseRunner*) this_pointer;
    try {
      self->execute();
    } catch (std::exception &err) {
      self->error = err.what();
    }
  }
 
  static void onWorkComplete(napi_env env, napi_status status, void *this_pointer) {
    PromiseRunner* self = (PromiseRunner*) this_pointer;
    if (status != napi_cancelled) {
      HandleScope scope(self->env);
      if (status == napi_ok) {
        status = napi_delete_async_work(self->env, self->work);
        if (status == napi_ok) {
          if (self->error.size() == 0) {
            self->onOK();
          } else {
            self->onError(Error::New(self->env, self->error));
          }
          delete self;
          return;
        }
      }
    }
 
    // fallthrough for error handling
    const napi_extended_error_info *error_info = 0;
    napi_get_last_error_info(env, &error_info);
    if (error_info->error_message){
      self->onError(Error::New(env, error_info->error_message));
    } else {
      self->onError(Error::New(env));
    }
    delete self;
  }
 
  virtual void execute() {}
  virtual Value getResult() {
    return env.Null();
  }
 
  void onOK() {
    HandleScope scope(env);
    Value result = getResult();
    deferred.Resolve(result);
  }
 
  void onError(const Error &e) {
    deferred.Reject(e.Value());
  }
};
 
#endif