请问 javascript promise 的异步方法,到底怎么同步执行?

2016-11-14 22:45:59 +08:00
 maomaomao001
console.log('开始');


var zz =  sequelize.query("show tables",{ type: sequelize.QueryTypes.SHOWTABLES}).then((results)=>{
    results.forEach((item)=>{
        var bb =sequelize;

        console.log(item);
    });
});
console.log('1111');

现在的结果是
开始
111
然后再是表格信息

11942 次点击
所在节点    问与答
28 条回复
maomaomao001
2016-11-14 22:52:50 +08:00
表的信息
Herobs
2016-11-14 22:55:56 +08:00
为什么要同步呢,同步就是一直等,线程被阻塞了
Herobs
2016-11-14 22:57:03 +08:00
你可以把把输出 1111 放到回调函数里面,或者使用 waterfall 这样的函数
smallpath
2016-11-14 23:02:19 +08:00
sequelize 还可以用在前端?

不过无所谓,去搭 babel ,你要的就是 async/await
maomaomao001
2016-11-14 23:05:10 +08:00
@Herobs 问题不是把 1111 放到回调里面~~ 我希望它同步执行啊~~
bdbai
2016-11-14 23:09:04 +08:00
Promise 就是解决异步问题的,根据 Nodejs 的特性,没法同步。
运行到 var zz 这一行时, sequelize 跑去异步取数据了,这是一个异步操作。还没取到数据,接着往下执行输出 1111 。等数据取回来了,又回进 then 里处理 results 。

你可以在 then 函数后面再跟一个.then ,这样处理完第一个 then 才会进第二个 then 。
maomaomao001
2016-11-14 23:14:49 +08:00
```

hello = Action.create({
handler:function(req:vRequest,reply){

//我要在这里取一点数据 -----
sequelize.query("show tables",{ type: sequelize.QueryTypes.SHOWTABLES}).then((results)=>{
results.forEach((item)=>{
console.log(item);
});
});

//可是还没取出来,它就往下执行,都已经吧 request 处理完了,返回了啊~~

req.ex.attr['文章'] ={
标题:'文章标题',
作者:'maomaomao',
内容:'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
};

req.ex.template.file = 'index.ejs';

}
});

```

真的不能同步吗?
如果不能的话, nodejs 有没有 同步的 执行 sql 的 框架啊?
maomaomao001
2016-11-14 23:16:49 +08:00
该是说,我像的不对吗??? 如果你们写 web 程序的话,这样的问题怎么处理?
bdbai
2016-11-14 23:19:26 +08:00
@maomaomao001 你没理解“异步”吧,即便函数返回了,回调还可以“倒回去”执行的。
按照 Promise 的做法,你在 then 函数后面再跟个 then 就能按顺序进行了。

如果真用同步的,那查询一次整个线程就卡住了,完全没有发挥出 Nodejs 异步的优势。
zhouquanbest
2016-11-14 23:20:51 +08:00
await
yield
maomaomao001
2016-11-14 23:25:08 +08:00
@bdbai 我知道异步是什么意思。
关键,我使用的框架都已经把数据返回给客户端了,我是的数据库还没异步查询完。。。数据到不了客户端,这怎么解决?
murmur
2016-11-14 23:27:53 +08:00
@maomaomao001 轮询后台啊 报表不都是这样么 定期在大半夜生成 等第二天上班的时候去看
bdbai
2016-11-14 23:29:19 +08:00
@maomaomao001 你用的啥框架?主流 web 框架都没有这个问题啊...
maomaomao001
2016-11-14 23:32:01 +08:00
@bdbai express , 我是感觉 这个查询不同步完全不可以,
就像 nodejs 自己的同步读写文件那样。。。异步固然很好,但是同步影响逻辑啊
bdbai
2016-11-14 23:40:22 +08:00
@maomaomao001 你这不像 express 啊,贴一下完整代码吧。

我写的一个小例子:
https://github.com/bdbai/nthskeys-node/blob/master/router/apiRouter.js

用到 Nodejs 你就得接受异步的用法,不能因为理解不了就选择逃避...
maomaomao001
2016-11-14 23:58:45 +08:00
@bdbai 天呐。。。 我怎么觉得这 promise 好反人类啊。。。
bdbai
2016-11-15 00:03:41 +08:00
@maomaomao001 并不反人类,一路 then 下去就可以了。搞明白 Promise 以后可以试试 async/await 。
FrankFang128
2016-11-15 03:07:03 +08:00
你中了同步的读
des
2016-11-15 08:59:28 +08:00
@maomaomao001 非要解释的简单的话,
你就想象,你吃了早饭才回去上班,可是你又不能盯着别人什么事都不做吧?(假设你很忙)
早点师傅会做好了通知你(通过回调或者类似的东西)
你吃了早点就可以高高兴兴的去上班了(返回给用户)

同步就像是你坐公交上班,每个路口都可能要等红灯
maomaomao001
2016-11-15 09:06:26 +08:00
@bdbai 我突然发现一个更严重的问题。 在处理一个请求的时候,比如空循环耗时操作 10 秒的话,第二个浏览器访问的时候居然只能等到第一个浏览器结束后才开始?? nodejs 高并发体现在哪里啊?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/320516

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX