2016-09-07 2 views
5

내가 가지고있는 함수 인수는 비동기 함수 인 약속 반환하는 다음 함수에 반환하지 : 나는 시험에서에서 다음과 같이 함수를 호출 할 경우비동기 기다리고 있습니다 또는 약속 스트림 이벤트

createObjectFrom(record) { 
    const self = this; 
    return new Promise(async (resolve, reject) => { 
     let obj = {}; 

     for(let i = 0, l = self.opts.transformers.length; i < l; i++) { 
     let transformer = self.opts.transformers[i]; 

     const headerIndex = findIndex(self.headers, (header) => { 
      return header === transformer.column; 
     }); 

     let csvValue = record[headerIndex]; 

     const lookUp = transformer.options.lookUp; 

     const whereClause = {}; 

     whereClause[lookUp.column] = csvValue; 

     console.log('before await'); 

     const result = await self.knex(lookUp.table).where(whereClause).select(lookUp.scalar); 

     console.dir(result); 

     obj[transformer.field] = result[0][lookUp.scalar]; 
     } 

     return resolve(obj); 
    }); 
    } 

을 모두 정확하게 실행 :

:

it('creates the transformed object', async() => { 
    const csvRecord = ['PREMIER', '07/11/1998', manager, 'Liverpool', 'Wimbledon', 0, 1, 'A', 0, 1, 'A']; 

    const record = await transformer.createObjectFrom(csvRecord); 

    expect(record.division).to.equal('PREMIER'); 
    } 

을하지만 csv-parse에서 생성 된 스트림으로부터 발생 된 이벤트 동안 readablecreateObjectFrom 함수를 호출 할 때

onReadable() { 
    let record = this.parser.read(); 

    if (record === null) { 
     return; 
    } 

    if (this.parser.count <= 1) { 
     this.headers = record; 
    } else { 
     const recordPromises = this.createObjectFrom(record); 
     this.recordPromises.push(newRecord); 
    } 
    } 

코드에 createObjectFrom

console.log('before here'); 
    const result = await self.knex(lookUp.table).where(whereClause).select(lookUp.scalar); 
    console.dir(result); 

아래 console.log 문에 도달하지만 약속이 해결하지 않는 것으로 아래 console.dir 문에 도착하지 않습니다.

createObjectFrom을 스트림 처리 외부의 테스트에서 호출하면 올바르게 해석됩니다.

리팩토링 비동기도 약속을 반환하기 위해 기다리고 있지만 여전히 파손 상태입니다.

If I console.dir the promises on the [end][3] event of the stream they look like this: 

[ Promise { 
    _bitField: 0, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined }, 
    Promise { 
    _bitField: 0, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined } ] 

나는 소스 코드와 실패한 테스트를 가지고 this REPO 있습니다.

나는 무슨 일이 벌어지고 있는지에 대해 당혹 스럽다.

it('creates the transformed object', async() => { 
    const csvRecords = [ 
     ['PREMIER', '07/11/1998', manager, 'Liverpool', 'Wimbledon', 0, 1, 'A', 0, 1, 'A'], 
     ['PREMIER', '11/11/1998', manager, 'QPR', 'Sunderland',3,3, 'Sunderland',0,0,'Sunderland'], 
     ['PREMIER', '14/11/1998', manager, 'Southampton', 'Liverpool', 3, 3, 'D', 0, 0, 'D'] 
    ]; 

    for(var i = 0, l = csvRecords.length; i < l; i++) { 
     const csvRecord = csvRecords[i]; 

     const record = await transformer.createObjectFrom(csvRecord); 

     expect(record.division).to.equal('PREMIER'); 

     expect(record.manager_id).to.equal(manager_id); 
    } 
    } 
+3

내가 무엇을 놓치고 있는지 모르겠지만 우리는 피델을 놓치고 있습니다. – smnbbrv

+0

브라우저가이 스크립트를 지원하지 않는 특별한 이유가 없습니다. 'await'는 es6 생성기 (또는 그들이 사용하는 것이 무엇이든)에 바벨로 변형 될 수 있습니다. 현대 크롬/파이어 폭스 브라우저에 충분해야합니다. – smnbbrv

+0

당신은 다른 도움을받지 못할 가능성이 높습니다. 특정이며 임의의 추측 (높은 확률은 아님) 또는 디버깅만으로 해결할 수 있습니다. – smnbbrv

답변

2

는이 같은 코드를 변경하지 않는 이유 :

createObjectFrom: async (record) => { 
    const self = this; 
    // return new Promise(async (resolve, reject) => { 
     let obj = {}; 

     for(let i = 0, l = self.opts.transformers.length; i < l; i++) { 
     let transformer = self.opts.transformers[i]; 

     const headerIndex = findIndex(self.headers, (header) => { 
      return header === transformer.column; 
     }); 

     let csvValue = record[headerIndex]; 

     const lookUp = transformer.options.lookUp; 

     const whereClause = {}; 

     whereClause[lookUp.column] = csvValue; 

     console.log('before await'); 

     const result = await self.knex(lookUp.table).where(whereClause).select(lookUp.scalar); 

     console.dir(result); 

     obj[transformer.field] = result[0][lookUp.scalar]; 
     } 
     return obj; 
     // return resolve(obj); 
    // }); 
    } 
+0

동일한 거래, 첫 번째 호출을 기다리고 나서 실행이 절대 반환되지 않습니다. – dagda1

+0

거기에 문제가있을 수 있습니다. 'self.knex (lookUp.table) .where (whereClause) .select (lookUp.scalar);' – chenkehxx

+0

이 코드는 호출시 작동합니다 위의 세부 테스트에서 – dagda1

2

OMG를, 무엇을 엉덩이 아래의 테스트는 그렇게 통과

는 확실히 스트림 함께 할 수있는 뭔가있다 , 나는 시험에서 약속을 되돌려주지 않았기 때문에 그랬다. mocha로 약속을 테스트 할 때는 it 함수에서 약속을 반환해야합니다. 이렇게하면 모든 것이 작동합니다. 정말 바보 로군!

describe('transformer',() => { 
    it('transforms the data and imports the csv file',() => { 

     const ignoreIf = (data) => data[3] !== 'Liverpool' && data[4] !== 'Liverpool'; 
     const opts = { table: 'results', file: __dirname + '/fixtures/test.csv', encoding: 'utf8', transformers, ignoreIf: ignoreIf }; 

     const f = seeder(opts)(knex, Promise); 

     return f.then((results) => { 
     console.dir(results); 
     }); 
    }); 

I return f을 모두 지금 좋은 :

그래서 나는이에 테스트를 변경하는 경우.

관련 문제