다음 코드는 몇 가지 숫자를 저장하겠다는 약속의 배열을 작성한 다음 co 라이브러리를 사용하여 약속을 생성하고 결과를 인쇄합니다. 그러나 내가 이해하지 못하는 것은 출력을 출력 할 때 동일한 레코드를 10 번 인쇄한다는 것입니다. I는 약속 내부 변수 x
를 선언하면, 그때 예상 결과 (예를 들어 10 개의 얻을mongoose와 es6이 예상대로 작동하지 않는다고 약속합니다.
/tmp/test$ node m
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
{"__v":0,"num":9,"_id":"57d1931037a370055f51977c"}
주 : 여기
'use strict'
const Promise = require('bluebird');
const co = require('co');
const _ = require('lodash');
const mongoose = require('mongoose');
// plug in the bluebird promise library for mongoose
mongoose.Promise = Promise;
mongoose.connect('mongodb://localhost:27017/nodejs_testing');
const numSchema = new mongoose.Schema({
num: { type: Number, required: true }
});
const Num = mongoose.model('Num', numSchema);
let promises = [];
let x;
// create an array of promises to save some numbers
for (let i = 0; i < 10; ++i) {
let p = new Promise((resolve,reject) => {
x = Num();
x.num = i;
x.save((err) => {
if (err) {
reject(err);
} else {
resolve(x);
}
});
});
promises.push(p);
};
// yield all the promises, then print out the results
co(function *() {
let res = yield Promise.all(promises);
_.each(res, item => {
console.log(JSON.stringify(item));
});
mongoose.disconnect();
});
가 출력된다 : 여기
는 코드 출력의 숫자). 즉,이 변경 (아래 참조)을하면 예상대로 작동합니다.
let p = new Promise((resolve,reject) => {
let x = Num(); // <--- declare x inside the promise
.
.
});
제 질문은이 코드가이 방식으로 작동하는 이유는 무엇입니까? mongodb/mongoose를 사용하여 정확히 동일한 유형의 테스트를 반복하고 일부 번호 만 인쇄하면 Promise 외부에서 x
으로 선언 된 경우에도 예상대로 작동합니다. 아래의 샘플 코드 :
'use strict'
const Promise = require('bluebird');
const co = require('co');
const _ = require('lodash');
class Number {
constructor(num) {
this.num = num;
}
};
let x;
let promises = [];
for (let i = 0; i < 10; ++i) {
let p = new Promise((resolve,reject) => {
setTimeout(() => {
x = new Number(i);
resolve(x);
}, 300);
});
promises.push(p);
};
co(function *() {
let res = yield Promise.all(promises);
_.each(res, item => {
console.log(JSON.stringify(item));
});
});
출력 :
/tmp/test$ node t
{"num":0}
{"num":1}
{"num":2}
{"num":3}
{"num":4}
{"num":5}
{"num":6}
{"num":7}
{"num":8}
{"num":9}
(내가 언급 한 질문에) 그러나 나는 단지 내가 왜 그런 행동을하는지 이해하고 싶었다. 어쨌든, 좋은 설명, 고마워! – dcp