Skip to content

Commit 0796c51

Browse files
committed
使用 sync 替换 mq.await
1 parent a1219dc commit 0796c51

File tree

7 files changed

+62
-110
lines changed

7 files changed

+62
-110
lines changed

fibjs/include/JSHandler.h

+20-8
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616
namespace fibjs {
1717

1818
class JSHandler : public Handler_base {
19+
20+
public:
21+
JSHandler(v8::Local<v8::Value> proc, bool async = false);
22+
1923
FIBER_FREE();
2024

2125
public:
@@ -31,10 +35,10 @@ class JSHandler : public Handler_base {
3135
AsyncEvent* ac);
3236

3337
public:
34-
static result_t New(v8::Local<v8::Value> hdlr,
35-
obj_ptr<Handler_base>& retVal)
38+
static result_t New(v8::Local<v8::Value> hdlr, obj_ptr<Handler_base>& retVal)
3639
{
37-
if (hdlr->IsString() || hdlr->IsStringObject() || hdlr->IsNumberObject() || hdlr->IsRegExp() || (!hdlr->IsFunction() && !hdlr->IsObject()))
40+
if (hdlr->IsString() || hdlr->IsStringObject() || hdlr->IsNumberObject() || hdlr->IsRegExp()
41+
|| (!hdlr->IsFunction() && !hdlr->IsObject()))
3842
return CHECK_ERROR(CALL_E_BADVARTYPE);
3943

4044
retVal = Handler_base::getInstance(hdlr);
@@ -53,9 +57,8 @@ class JSHandler : public Handler_base {
5357
return 0;
5458
}
5559

60+
v8::Local<v8::Object> o = v8::Local<v8::Object>::Cast(hdlr);
5661
if (!hdlr->IsFunction()) {
57-
v8::Local<v8::Object> o = v8::Local<v8::Object>::Cast(hdlr);
58-
5962
obj_ptr<Routing_base> r = new Routing();
6063
result_t hr = r->append(o);
6164
if (hr < 0)
@@ -65,16 +68,25 @@ class JSHandler : public Handler_base {
6568
return 0;
6669
}
6770

68-
obj_ptr<JSHandler> r = new JSHandler();
69-
r->SetPrivate("handler", hdlr);
71+
Isolate* isolate = Isolate::current();
72+
v8::Local<v8::Value> _async = o->GetPrivate(o->CreationContext(),
73+
v8::Private::ForApi(isolate->m_isolate, isolate->NewFromUtf8("_async")))
74+
.ToLocalChecked();
75+
76+
if (!IsEmpty(_async))
77+
retVal = new JSHandler(_async, true);
78+
else
79+
retVal = new JSHandler(hdlr);
7080

71-
retVal = r;
7281
return 0;
7382
}
7483

7584
public:
7685
static result_t js_invoke(Handler_base* hdlr, object_base* v,
7786
obj_ptr<Handler_base>& retVal, AsyncEvent* ac);
87+
88+
private:
89+
bool m_async;
7890
};
7991

8092
} /* namespace fibjs */

fibjs/include/ifs/mq.h

-7
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class mq_base : public object_base {
2929
// mq_base
3030
static result_t jsHandler(v8::Local<v8::Value> hdlr, obj_ptr<Handler_base>& retVal);
3131
static result_t await(obj_ptr<Handler_base>& retVal);
32-
static result_t await(v8::Local<v8::Function> proc, obj_ptr<Handler_base>& retVal);
3332
static result_t nullHandler(obj_ptr<Handler_base>& retVal);
3433
static result_t invoke(Handler_base* hdlr, object_base* v, AsyncEvent* ac);
3534

@@ -113,12 +112,6 @@ inline void mq_base::s_await(const v8::FunctionCallbackInfo<v8::Value>& args)
113112

114113
hr = await(vr);
115114

116-
METHOD_OVER(1, 1);
117-
118-
ARG(v8::Local<v8::Function>, 0);
119-
120-
hr = await(v0, vr);
121-
122115
METHOD_RETURN();
123116
}
124117

fibjs/include/ifs/mq.idl

-17
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,6 @@ module mq
5757
*/
5858
static Handler await();
5959

60-
/*! @brief 创建一个异步等待处理器
61-
@param proc 指定异步处理事务
62-
@return 返回创建的处理器
63-
64-
异步等待处理器用于需要异步处理的消息处理模式,示例如下:
65-
@code
66-
var hdr = mq.await((v, done) => {
67-
....
68-
....
69-
70-
done();
71-
};
72-
@endcode
73-
示例是一个异步消息处理器,处理器接受任务后,将进入异步运行状态,直到 done 被调用,才继续下一阶段的处理。
74-
*/
75-
static Handler await(Function proc);
76-
7760
/*! @brief 创建一个空处理器对象,次处理对象不做任何处理直接返回
7861
@return 返回空处理函数
7962
*/

fibjs/src/global/global.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,12 @@ static void sync_stub(const v8::FunctionCallbackInfo<v8::Value>& args)
8787

8888
result_t global_base::sync(v8::Local<v8::Function> func, v8::Local<v8::Function>& retVal)
8989
{
90-
retVal = Isolate::current()->NewFunction("require", sync_stub, func);
90+
Isolate* isolate = Isolate::current();
91+
92+
retVal = isolate->NewFunction("require", sync_stub, func);
93+
retVal->SetPrivate(retVal->CreationContext(),
94+
v8::Private::ForApi(isolate->m_isolate, isolate->NewFromUtf8("_async")), func);
95+
9196
return 0;
9297
}
9398

fibjs/src/mq/AsyncWaitHandler.cpp

-50
Original file line numberDiff line numberDiff line change
@@ -50,54 +50,4 @@ result_t mq_base::await(obj_ptr<Handler_base>& retVal)
5050
return 0;
5151
}
5252

53-
class AsyncHandler : public Handler_base {
54-
public:
55-
AsyncHandler(v8::Local<v8::Function> proc)
56-
{
57-
SetPrivate("_proc", proc);
58-
}
59-
60-
public:
61-
// Handler_base
62-
virtual result_t invoke(object_base* v, obj_ptr<Handler_base>& retVal,
63-
AsyncEvent* ac)
64-
{
65-
if (ac)
66-
return CHECK_ERROR(CALL_E_NOASYNC);
67-
68-
v8::Local<v8::Value> v1;
69-
v1 = GetPrivate("_proc");
70-
if (IsEmpty(v1))
71-
return CALL_RETURN_NULL;
72-
73-
Isolate* isolate = holder();
74-
75-
retVal = new AsyncWaitHandler();
76-
v8::Local<v8::Function> proc = v8::Local<v8::Function>::Cast(v1);
77-
78-
v8::Local<v8::Value> args[2];
79-
80-
args[0] = v->wrap();
81-
args[1] = isolate->NewFunction("done", _done, retVal->wrap());
82-
83-
proc->Call(args[0], 2, args);
84-
return 0;
85-
}
86-
87-
public:
88-
static void _done(const v8::FunctionCallbackInfo<v8::Value>& args)
89-
{
90-
AsyncWait_base* v = AsyncWait_base::getInstance(args.Data()->ToObject());
91-
if (v)
92-
v->end();
93-
args.GetReturnValue().SetUndefined();
94-
}
95-
};
96-
97-
result_t mq_base::await(v8::Local<v8::Function> proc, obj_ptr<Handler_base>& retVal)
98-
{
99-
retVal = new AsyncHandler(proc);
100-
return 0;
101-
}
102-
10353
} /* namespace fibjs */

fibjs/src/mq/JSHandler.cpp

+30-21
Original file line numberDiff line numberDiff line change
@@ -13,32 +13,22 @@
1313
#include "ifs/global.h"
1414
#include "ifs/mq.h"
1515
#include "ifs/console.h"
16+
#include "AsyncWaitHandler.h"
1617

1718
namespace fibjs {
1819

19-
inline result_t msgMethod(Message_base* msg, exlib::string& method)
20+
static void _done(const v8::FunctionCallbackInfo<v8::Value>& args)
2021
{
21-
exlib::string str;
22-
const char *p, *p1;
23-
24-
msg->get_value(str);
25-
26-
p = p1 = str.c_str();
27-
while (true) {
28-
while (*p && *p != '.' && *p != '/' && *p != '\\')
29-
p++;
30-
if (p != p1)
31-
break;
32-
if (!*p)
33-
return CHECK_ERROR(Runtime::setError("JSHandler: method \"" + method + "\" not found."));
34-
p++;
35-
p1 = p;
36-
}
37-
38-
msg->set_value(*p ? p + 1 : "");
39-
method.assign(p1, (int32_t)(p - p1));
22+
AsyncWait_base* v = AsyncWait_base::getInstance(args.Data()->ToObject());
23+
if (v)
24+
v->end();
25+
args.GetReturnValue().SetUndefined();
26+
}
4027

41-
return 0;
28+
JSHandler::JSHandler(v8::Local<v8::Value> proc, bool async)
29+
: m_async(async)
30+
{
31+
SetPrivate("handler", proc);
4232
}
4333

4434
result_t JSHandler::invoke(object_base* v, obj_ptr<Handler_base>& retVal,
@@ -47,6 +37,25 @@ result_t JSHandler::invoke(object_base* v, obj_ptr<Handler_base>& retVal,
4737
if (ac)
4838
return CHECK_ERROR(CALL_E_NOASYNC);
4939

40+
if (m_async) {
41+
v8::Local<v8::Value> v1 = GetPrivate("handler");
42+
if (IsEmpty(v1))
43+
return CALL_RETURN_NULL;
44+
45+
Isolate* isolate = holder();
46+
47+
retVal = new AsyncWaitHandler();
48+
v8::Local<v8::Function> proc = v8::Local<v8::Function>::Cast(v1);
49+
50+
v8::Local<v8::Value> args[2];
51+
52+
args[0] = v->wrap();
53+
args[1] = isolate->NewFunction("done", _done, retVal->wrap());
54+
55+
proc->Call(args[0], 2, args);
56+
return 0;
57+
}
58+
5059
v8::Local<v8::Object> o = v->wrap();
5160
Isolate* isolate = holder();
5261

test/mq_test.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -459,27 +459,27 @@ describe("mq", () => {
459459
assert.equal(n, 400);
460460
});
461461

462-
it("await(func)", () => {
462+
it("sync(func)", () => {
463463
var n = 100;
464464

465-
mq.invoke(mq.await((v, done) => {
465+
mq.invoke(mq.jsHandler(sync((v, done) => {
466466
function delayend() {
467467
assert.equal(n, 100);
468468
n = 200;
469469
done();
470470
}
471471
setTimeout(delayend, 10);
472-
}), m);
472+
})), m);
473473
assert.equal(n, 200);
474474

475475
n = 300;
476-
mq.invoke(mq.await((v, done) => {
476+
mq.invoke(mq.jsHandler(sync((v, done) => {
477477
assert.equal(n, 300);
478478
n = 400;
479479
done();
480-
}), m);
480+
})), m);
481481
assert.equal(n, 400);
482482
});
483483
});
484484

485-
// test.run(console.DEBUG);
485+
// test.run(console.DEBUG);

0 commit comments

Comments
 (0)