generated from amazon-archives/__template_MIT-0
-
Notifications
You must be signed in to change notification settings - Fork 385
Open
Description
I thought that in DelSkayn/rquickjs#564 it became possible to return an iterator from Rust to JavaScript, so I tried the following implementation, but it doesn't work as expected.
pub fn keys<'js>(&self, ctx: Ctx<'js>) -> Result<Value<'js>> {
let iter = self
.headers
.iter()
.map(|(k, _)| k.as_ref().to_owned())
.collect::<Vec<_>>();
Iterable::from(iter).into_js(&ctx)
}Test pattern used to check operation:
// reproduction.js
function run() {
const headers = new Headers([
['x-first', '1'],
['x-second', '2'],
]);
const iter = headers.keys();
console.log('typeof iter[Symbol.iterator]:', typeof iter[Symbol.iterator]);
console.log(
'iter[Symbol.iterator]() === iter:',
iter[Symbol.iterator]() === iter
);
const collected = [];
for (const k of headers.keys()) {
collected.push(k);
}
console.log('for..of result:', collected);
const spread = [...headers.keys()];
console.log('spread result:', spread);
console.log('--- iterator.next() ---');
const iter2 = headers.keys();
let step;
step = iter2.next();
console.log('next #1:', step); // { value: 'x-first', done: false }
step = iter2.next();
console.log('next #2:', step); // { value: 'x-second', done: false }
step = iter2.next();
console.log('next #3:', step); // { value: undefined, done: true }
step = iter2.next();
console.log('next #4:', step); // { value: undefined, done: true }
}
run();The output is as follows:
% node ./reproduction.js
typeof iter[Symbol.iterator]: function
iter[Symbol.iterator]() === iter: true
for..of result: [ 'x-first', 'x-second' ]
spread result: [ 'x-first', 'x-second' ]
--- iterator.next() ---
next #1: { value: 'x-first', done: false }
next #2: { value: 'x-second', done: false }
next #3: { value: undefined, done: true }
next #4: { value: undefined, done: true }
% llrt ./reproduction.js
typeof iter[Symbol.iterator]: function
iter[Symbol.iterator]() === iter: false
for..of result: [ 'x-first', 'x-second' ]
spread result: [ 'x-first', 'x-second' ]
--- iterator.next() ---
TypeError: not a function
at run (/Users/shinya/Workspaces/llrt-test/reproduction.js:30:16)
at <anonymous> (/Users/shinya/Workspaces/llrt-test/reproduction.js:43:1)
Am I missing something?
Metadata
Metadata
Assignees
Labels
No labels